小林 (koichik) です.

> この書き換えの結果を見る限りdomainは単一にしか持っておらず、複数のdomainが
> 並行して稼働するような環境では使えない。

Node はシングルスレッドな環境なので,そもそも
「並行して稼働」することはないわけですが...
ある時点でいくつのドメインが存在していても,
アクティブなドメインは高々一つだけです.

ドメインの基本的なメカニズムは

> DomainクラスがuncaughtExceptionを補足できるのは prototype.enter, exit メソッドで
>  process.domain を単純に書き換えているからのように見えます。(v0.8.1 domain.js L:82, L:95)

でいいのですが,ドメインに関連づけられた
コールバック関数や EventEmitter のリスナ関数が
呼び出される際,そのドメインの enter() が
呼び出されるので,複数のドメインが存在していても,
適切なドメインがアクティブになるようになってます.

var d1 = domain.create();
d1.on('error', function(err) {...});

var d2 = domain.create();
d2.on('error', function(err) {...});

d1.run(function() {
  setTimeout(function cb() {
    throw new Error();
  }, 100);
});

ここで setTimeout() は d1 のコンテキストで呼び出されたため,
コールバック関数 cb が呼び出される前に d1.enter() されます.
そのため,cb からスローされた例外は d1 上の 'error' イベントで
取得できるようになります.

他のドメインに属するコールバックやリスナが呼び出される
場合も,そのドメインの enter() が呼び出されます.

process.domain は,あるコールバックやリスナに紐付けられた
「現在のアクティブなドメイン」を参照していて,それは
コールバックやリスナが呼び出される前後で書き換えられるので,
複数のドメインがあっても問題ないわけです.


On Wed, 4 Jul 2012 03:47:03 -0700 (PDT), Yoshitaka Sakamoto 
<[email protected]> wrote:

> @ystk_skm です。
> いつもMLを楽しく拝見させていただいております、ありがとうございます。
> (投稿は多分初ですが)
> 
> 本日domainを使ってみたところ予想通りに動かず、ソースコードを少し
> 確認したところ気になった点があり質問させて頂く次第です。
> 
> DomainクラスがuncaughtExceptionを補足できるのは prototype.enter, exit メソッドで
>  process.domain を単純に書き換えているからのように見えます。(v0.8.1 domain.js L:82, L:95)
> 
> この書き換えの結果を見る限りdomainは単一にしか持っておらず、複数のdomainが
> 並行して稼働するような環境では使えない。
> (そんな場合は child-process で process自体を分けろ的なメッセージ?)
> 
> てことでdomainは単純に try-cache をそこら中に書かなくてd.on('error') を書くだけでいいんだよ、という
> 素晴らしい兵器ではないと考えた次第ですが、そのような理解で適切でしょうか。
> Domainに対する理解の仕方、適切な利用へのご意見、ご指導等いただければ幸いです。
> 
> よろしくお願いします。
> 


-- 
{
  name: "Koichi Kobayashi",
  mail: "[email protected]",
  blog: "http://d.hatena.ne.jp/koichik/";,
  twitter: "@koichik"
}

メールによる返信