我最喜欢 Node 的是无线程,这意味着每一行代码都可以被认为是原子的。因此,您可以轻松编写几行 JS 代码,该代码将运行一个套接字服务器,该服务器将为工作人员提供您想要的确切机制,如您的示例代码所示。
我不确定调用这个信号量在技术上是否正确,因为我们会跟踪等待轮到他们的工人。
工作人员:
var Semaphore = reqire('./semaphore.js'),
semaphore = new Semaphore(worker-id, group-id);
semaphore.on('ready', function() {
// Yay! We can work..!
semaphore.done();
}
semaphore.js 骨架:
// imports...
module.exports = S = function(gid) {
events.EventEmitter.call(this);
// create socket connection to semaphore server
// send a message for lock on gid
// emit ready event when server sends ready message.
// send 'done' message when done() method is called.
}; util.inherits(S, events.EventEmitter);
semaphore-server.js 框架:
// imports...
var queues = {}; // { 'group-id': [worker1, worker2, ...] }
// start socket server
/* on message: take worker-id and group-id
queues[groupid].push(workerid);
check if queues[groupid][0]==workerid and if it is,
send back ready message.
*/
/* on message 'done', remove workerid from queues[groupid]
and if there are any workers waiting, send the first one
ready message.
*/
您的代码不会比上面的这个骨架长多少。对于这种简单的消息传递系统,ZeroMQ 或任何其他消息传递不是必需的。您可能会考虑向工作人员添加超时,并且每当发生超时时,向工作人员发送一条消息,询问“您还在工作吗?” 并按此继续。您的超时处理程序还可以检查队列中是否有任何其他工作人员,所以如果没有,甚至没有必要打扰工作人员时间......
如果我只需要一个像这样可以在一个小时内构建的简单系统,我通常更喜欢使用我已经拥有的工具而不是去第三方。任何其他库/dbms/messaing-system 或任何会增加我不喜欢的软件的复杂性和管理工作的东西。由于您已经在 Node 中构建了一些东西,并且它已经完美地提供了您想要的东西,我相信这是要走的路。