小林 (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"
}