む、難しいですね。今の自分にはどうしていいのか??
真鍋様のおっしゃる内容がどのようなコードになるのか気になります。
//私なら最初に Stream の 'readable' イベント内でできる事は無いかを考える('data' イベントが発生する直前に実行される)。
変な質問ですが、
//(1) キャッシュが存在しないことを確認し、
(2) キャッシュを作成して fs.stat() を呼び出し、
(3) 'data' イベントが発生するとキャッシュの中身を設定
と流れていくことはもう理解できているかと思います。
では、この途中のどこかで別のリクエスト B が到着すると
どうなるでしょうか?
の部分で、
A(1)->A(3)->A(2)->B(1)->B(3)->B(2) とかなったりしたら、
A(3)では まだ、 キャッシュcache[f]作成されていないからエラーになったりとか??しないんですかね?
的外れな質問だとすいません。。
課題について、もっと考えてみます!
教えて頂きありがとうございます!!
2013年4月16日火曜日 1時20分00秒 UTC+9 koichik:
>
> 小林 (koichik) です.
>
> 勝手に課題シリーズ第二弾w
> 前のメールでも書いたように、非同期 API では
>
> ... //(1)
> foo(hoge, function(err) {
> ... //(2)
> });
> ... //(3)
>
> の場合の処理順は (1)->(3)->(2) となります。
>
> 問題のコードは HTTP を処理するリスナの中に
> あるので、
>
> http.createServer(function(req, res) {
> ... //(1)
> foo(hoge, function(err) {
> ... //(2)
> });
> ... //(3)
> });
>
> となるわけですが、ここで二つの HTTP リクエスト、
> A と B がほとんど同時に (ただし A が先に) 到着した
> 場合の処理順を考えてみましょう。
>
> その場合は、
> A(1)->A(3)->A(2)->B(1)->B(3)->B(2) となる。。。
> 保証はなくて、
>
> A(1)->A(3)->B(1)->B(3)->A(2)->B(2) だったり
> A(1)->A(3)->B(1)->B(3)->B(2)->A(2) だったり
> する可能性もあります。
> リクエスト A に関する処理が全て完了してから
> リクエスト B の処理が開始されるとは限らない
> わけです。
>
> さて、問題のコードからキャッシュの処理に着目すると、
>
> http.createServer(function (request, response) {
> //(1)
> if(cache[f]) {
> response.writeHead(200, headers);
> response.end(cache[f].content);
> return;
> }
>
> fs.stat(f, function(err, stats) {
> //(2)
> var bufferOffset = 0;
> cache[f] = {content: new Buffer(stats.size)};
> s.on('data', function(data) {
> //(3)
> data.copy(cache[f].content, bufferOffset);
> bufferOffset += data.length;
> });
> });
> }).listen(8080);
>
> という構造を抽出できるのですが、最初に到着した
> リクエスト A の処理では、
>
> (1) キャッシュが存在しないことを確認し、
> (2) キャッシュを作成して fs.stat() を呼び出し、
> (3) 'data' イベントが発生するとキャッシュの中身を設定
>
> と流れていくことはもう理解できているかと思います。
>
> では、この途中のどこかで別のリクエスト B が到着すると
> どうなるでしょうか?
>
> A(1)->A(2)->A(3)
>
> と進む途中のどこかで、リクエスト B の処理が
> 挟まってきた場合を考えてみましょう。
>
> A(1)->B(1)->?
>
> とか、
>
> A(1)->A(2)->B(1)->?
>
> とか、タイミングによっては B の処理が進む経路も
> 変わってくるはずですね。
>
> 掲載されたコードはどんな場合でも正しく
> 動作するでしょうか?
> うまくいかないのはどんな場合?
> どんな場合でもうまく動くようにするに
> どうしたらいいでしょうか?
>
>
> On Mon, 15 Apr 2013 06:18:31 -0700 (PDT), aporo4000
> <[email protected]<javascript:>>
> wrote:
>
> > いまちょうどそれを勉強してる初心者なので、みなさんみたいにスラスラ書いたり出来るように頑張ります!
> >
> > --
> >
> > ---
> > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> > このグループから退会し、メールの受信を停止するには、[email protected]<javascript:>にメールを送信します。
> >
> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
> >
>
>
> --
> {
> name: "Koichi Kobayashi",
> mail: "[email protected] <javascript:>",
> blog: "http://d.hatena.ne.jp/koichik/",
> twitter: "@koichik"
> }
>
>
--
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。