Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
nodejs-锁、键和工作者-javascript世界中的同步代码和等待_Javascript_Synchronization_Task_Worker - Fatal编程技术网

nodejs-锁、键和工作者-javascript世界中的同步代码和等待

nodejs-锁、键和工作者-javascript世界中的同步代码和等待,javascript,synchronization,task,worker,Javascript,Synchronization,Task,Worker,这是一个典型的问题,这次是在nodejs环境中遇到的,经过一段时间的思考,我不确定解决这个问题的最佳方法是什么 我有: 4参考资料-让我们称这些为“键” X任务-让我们称这些为“锁” Y工人-实际上在1到4人之间 一个任务和一个资源的组合(不管是哪一个)是由工作者完成的作业:或者换句话说,工作者用钥匙打开锁:) 我想使用我的资源和工作人员尽快打开这些锁。 每个工人都应该试着抓一把钥匙,抓一把锁,打开锁,然后把钥匙放回去。 当没有钥匙可用时,工人需要等待钥匙到达。 当所有的锁都打开时,工人们就

这是一个典型的问题,这次是在nodejs环境中遇到的,经过一段时间的思考,我不确定解决这个问题的最佳方法是什么

我有:

  • 4参考资料-让我们称这些为“键”
  • X任务-让我们称这些为“锁”
  • Y工人-实际上在1到4人之间
一个任务和一个资源的组合(不管是哪一个)是由工作者完成的作业:或者换句话说,工作者用钥匙打开锁:)

我想使用我的资源和工作人员尽快打开这些锁。
每个工人都应该试着抓一把钥匙,抓一把锁,打开锁,然后把钥匙放回去。
当没有钥匙可用时,工人需要等待钥匙到达。
当所有的锁都打开时,工人们就可以回家喝啤酒了

如何在javascript/nodejs环境中解决此问题?
您可以随意使用redis/mongo/任何您需要的工具来实现这一点


请帮我让我的工人今天早点回家!:)

您可以使用RabbitMQ来解决此问题。您可以为每个工作人员维护4个不同的队列。每个工人都将绑定到一个单独的队列

因此,工作者将等待队列中没有消息。 一旦在您的案例中出现一条消息,工作人员就会启动 处理完成任务,然后再次等待下一个键

将有一个发布者和多个监听者,即一个主管和多个工人。 如果需要,您甚至可以实现批处理

例如:

  connection.on('ready', function () {
    connection.queue("queue_name", function(queue){
        connection.exchange('exchange_name', {type: 'topic', confirm: true},function(exchange){
            queue.bind('exchange_name'); 
            queue.subscribe({ack: true},function (message, headers, deliveryInfo) {
                try{
                    var data = unescape(message.data);
                    processMessage(data); // whatever needs to be done with the received message
                    queue.shift();
                }
                catch(e){
                    console.log('Some error occured.'+ e);
                }
            })
        })
    })
})

这是家庭作业问题吗?产生你的工人,给他们每个人一个键和一个回调。当他们回电话时,给他们另一把钥匙…不是家庭作业,真正的活生生的问题是如此经典,听起来像是家庭作业。我以前用Java解决了这个问题,Java提供了所有用于作业阻塞队列、等待和通知、信号量等的工具。在javascript中,这有点棘手,因为一切都是异步的。我已经在谷歌上搜索过了,但是所有的答案都与一个锁和两个等待它的进程有关。这里的情况更复杂(但也许可以用同样的方法解决,我只是还没弄明白)。如果你想回答,请以更详细的回答形式回答。如果你的问题要求任务同时以写的方式与相同的数据交互,那么可能需要更详细的解决方案——否则就像Oleg所说的那样。深入研究将有助于解决常见问题。实际上,我的解决方式有点不同,没有使用rabbitMQ,但同样的基本原则也适用:使用外部的东西来确保锁定机制。在我的例子中,是Kue+Redis。只需要一个作业队列,其中有4个工作人员侦听此作业名称并执行其操作。在每项工作完成后,我都将其删除,这样我就可以知道所有的工作都完成了,而Kue中已经没有类似的工作了。