2012-09-19 100 views

回答

0

我有很多問題,因爲node.js並不真正「分叉」,它「產生」或「fork/execs」。當我將羣集用於UDP服務器時,只有一個子進程會接收數據包,最後一個綁定。如果您只是「fork()」,則操作系統會將傳入的數據包發送給每個孩子。如果您「spawn()」遇到文件/套接字句柄的繼承權限問題,則必須設置選項等,並且基礎node.js udp服務器可能沒有應用這些選項。

我不得不編寫自己的擴展,簡單地稱爲底層OS fork(),並使其像普通分叉,網絡服務器一樣工作。

Windows沒有fork(),所以這種方法不起作用,這可能是爲什麼node.js沒有普通的普通花園變種fork()。這樣做會使其不能移植到Windows。

1)創建一個目錄,我稱之爲「util」。

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-waf configure」

如果順利的話,

4)運行「節點-WAF」

5)一個名爲「打造」新目錄將被創建,以及您的分機「建設/默認/ util.node」將一直創建。複製該內容並在節點程序中使用它:

var util = require(「util.node」);

var pid = util.fork();

還包含util.pid()函數,因爲分叉後process.pid不能正常工作。它提供了父進程的pid。

我是一個初學者節點擴展編寫器,所以如果這是一個天真的方法,哦,但它迄今爲止服務得很好。任何改進,如「簡化」將不勝感激。

+0

謝謝。 節點團隊已解決此問題 –

+0

... udp-cluster-v0.8分支(https://github.com/StrongLoop/node/commits/udp-cluster-v0.8)並將其合併到主節點中。 –

0

此問題已在node.js v0.10中得到解決

+0

解釋如何使用它的任何代碼片段將是很好的 –