node.js クラスターを使用すると TCP ソケット/ポートを共有するのは簡単ですが、UDP dgram ではこれを行うことはできないようです。
クラスターを使用するか、プロセス間でファイル記述子を共有するか、その他の方法でこれを行う方法はありますか?
node.js クラスターを使用すると TCP ソケット/ポートを共有するのは簡単ですが、UDP dgram ではこれを行うことはできないようです。
クラスターを使用するか、プロセス間でファイル記述子を共有するか、その他の方法でこれを行う方法はありますか?
node.jsは実際には「フォーク」ではなく、「スポーン」または「フォーク/エグゼクティブ」であるため、これに関して多くの問題が発生しました。UDPサーバーにクラスターを使用した場合、子プロセスの1つだけがパケットを受信し、最後の1つがバインドされました。単に「fork()」を実行すると、OSラウンドは着信パケットを各子にロビンします。「spawn()」を実行すると、ファイル/ソケットハンドルで継承権の問題が発生し、オプションを設定する必要があります。基盤となるnode.jsudpサーバーがそれらのオプションを適用していない可能性があります。
基盤となるOSfork()を呼び出すだけの独自の拡張機能を作成し、通常のフォークであるネットワークサーバーのように機能させる必要がありました。
Windowsにはfork()がないため、このアプローチは機能しません。おそらく、node.jsに通常のプレーンなガーデンバラエティfork()がないのはそのためです。そうすると、Windowsに移植できなくなります。
1)ディレクトリを作成します。私は「util」と呼びました。
2)これら2つのファイルをそのディレクトリに配置します。
-------------------ここで切り取り、次の「util.cc」に名前を付けます-------
#include <v8.h> //needed for extension infrastructure
#include <node.h> //needed for extension infrastructure
#include <iostream> // not part of extension infrastructure, just for the code I'm adding and only while developing to output debugging messages
using namespace node;
using namespace v8;
// The following two functions are examples of the minimum required for a node.js extension that does anything
static Handle<Value> spoon(const Arguments& args)
{
pid_t rval = fork();
if (rval < 0)
{
return ThrowException(Exception::Error(String::New("Unable to fork daemon, pid < 0.")));
}
Handle<Value> n = v8::Number::New(rval);
return n;
}
static Handle<Value> pid(const Arguments& args)
{
pid_t rval = getpid();
Handle<Value> n = v8::Number::New(rval);
return n;
}
extern "C" void init(Handle<Object> target)
{
NODE_SET_METHOD(target, "fork", spoon);
NODE_SET_METHOD(target, "pid", pid);
}
--------ここで切り取り、次の「wscript」に名前を付けます-------
def set_options(opt):
opt.tool_options("compiler_cxx")
def configure(conf):
conf.check_tool("compiler_cxx")
conf.check_tool("node_addon")
def build(bld):
obj = bld.new_task_gen("cxx", "shlib", "node_addon")
obj.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall"]
obj.target = "util"
obj.source = "util.cc"
---------切断の終わり、カッターを惜しまない------
3)「node-wafconfigure」を実行します
それがうまくいけば、
4)「node-waf」を実行します
5)「build」という新しいディレクトリが作成され、拡張機能「build / default/util.node」が作成されます。それをどこにでもコピーして、次のようにノードプログラム内から使用します。
var util = require( "util.node");
var pid = util.fork();
フォーク直後はprocess.pidが機能しないため、util.pid()関数も含まれています。親プロセスのpidを提供します。
私は初心者のノード拡張ライターなので、これが素朴なアプローチであれば、まあ、それは今のところ私に役立っています。「簡略化」のような改善があれば大歓迎です。
この問題は node.js v0.10 で解決されました