tommieです。 (2013/04/08 19:23), Shigeki Ohtsu wrote: > 大津です。 > >> 以下のサイトによると、 >> uv_async_send()を使えば別スレッドからいつでもメッセージを送信できるので >> すね。 >> Inter-thread communication >> http://nikhilm.github.io/uvbook/threads.html#inter-thread-communication >> > えー、 worker の中から uv_async_send() してるんですかぁ。 > これ async ハンドラが thread safe じゃないような気がしますが、大丈夫なん > かなぁ?
大丈夫だと思います。 uv_async_send()はworkerスレッドで実行しますが、 イベントキューにパラメータを書き込むだけで、 ハンドラは実行せずに直ぐに戻ります。 ハンドラはメインループスレッド(Node.jsのスレッド)で実行されます。 なので、ハンドラで、Node.jsのコールバック関数を呼べます。 渡されたパラメータについては、thread safeか注意が必要ですね。 テストプログラムで実験したいところです。 |д゜)チラッ 誰か、検証してくれないかしら… > 私だったら condition variable を使います。。 > > 参考:「libuvで消費者ー生産者問題を解く(Condition Variableを使う)」 > http://d.hatena.ne.jp/jovi0608/20121009/1349755819 condition variableは便利そうですね。 竹内さん(質問者さん)の応用の場合、63行目consumer()関数内の74行目辺りで メッセージ出力するNode.jsコールバック関数を呼ぶ必要がありますが、 consumer()はメインスレッドではないので、 このままでは、コールバック関数を呼べないと思うのですが、 いかがでしょうか。 メインスレッドでconsumer()を実行すると、ブロックしてしまうし。。。 結局、uv_async_send()のような、condVarとは別のスレッド間通信関数を呼ぶ必 要があるのでは。 >> 2.ネイティブアプリへNode.jsを埋め込み実行する >> → この場合は特にライブラリ化してなくても良いのでは。 >> >> ……と思ったのですが、 >> ぐぐっても2の例やドキュメントが見つかりませんでした。 >> 現状、Node.jsは、アプリへの埋め込みは想定していないようですね。 > ライブラリリンクで以外の「アプリへの埋め込み」が何を意味しているのか > ちょっとわかりませんが、アプリ単体が実行オブジェクトとしてしか存在しえな > いなら、Nodeと別プロセスでの起動になりますね。 > 1.Node.jsのアドオン と 2.アプリへのNode.js埋め込み の違いは 簡単にいうと main() がどこにあるかです。 1.では main()はNode.jsにありますね。 2.では main()はアプリにあります。 アプリのmain()の中でNode.js初期化関数を呼び出す形です。 なので、どちらも同一プロセスになります。 Pythonでは(当然、V8もですけどw)、2.アプリへの言語の埋め込みができます。 以下、Pythonを埋め込む例です。Py_*がPython関数。 #include <Python.h> int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); /* optional but recommended */ Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "print 'Today is',ctime(time())\n"); Py_Finalize(); return 0; } 以下から引用 http://docs.python.org/2/extending/embedding.html アプリへのNode.js埋め込みがサポートされると、 竹内さん(質問者さん)のような応用が簡単になると思います。 既存アプリにWebサーバログ出力機能追加ってわりと需要ありそうですよね。 もちろん、アドオンでもできますが。 何度も失礼しました。 -- --- このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。 その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
