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 にアクセスしてください。


メールによる返信