私が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やその他のメッセージングは必要ありません。ワーカーにタイムアウトを追加することを検討してください。タイムアウトが発生するたびに、「まだ作業していますか?」というメッセージをワーカーに送信してください。それに応じて続行します。タイムアウトハンドラーは、キューに他のワーカーが存在するかどうかを確認することもできるため、存在しない場合は、ワーカーに時間を費やす必要はありません...
私は通常、このように1時間で構築できる単純なシステムだけが必要な場合は、サードパーティに行くよりも、すでに手元にあるツールを使用することを好みます。他のlibrary/dbms / messaing-systemやその他のものは、私のソフトウェアに複雑さと管理上の煩わしさを追加しますが、私は好きではありません。あなたはすでにNodeで何かを構築していて、それはすでにあなたが望むものを完全に提供しているので、これが進むべき道だと私は信じています。