我最喜愛節點的東西替代的解決方案是無螺紋這意味着每行代碼可以被認爲是原子。因此,您可以輕鬆編寫幾行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);
信號量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中構建了一些東西,並且它已經完美地提供了您想要的東西,我相信這是要走的路。
在這種情況下'二年級'是什麼? – Joe 2012-04-28 19:02:25
我懷疑你的意思是信號量。 – 2012-04-28 19:09:18
我的意思是信號量 – work4liberty 2012-04-28 19:31:44