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

nodejs - locks, keys and workers - synchronous code and waiting in javascript world

本文关键字:代码 等待 世界 同步 工作者 Nodejs javascript      更新时间:2023-09-26

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

i have:

  • 4种资源——我们称它们为"钥匙"。
  • X任务——我们称之为"锁"。
  • Y工人-实际上在1到4之间。

1个任务和1个资源的组合(与哪个无关)是由worker完成的工作:或者换句话说- worker用钥匙打开锁:)

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

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

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

你可以使用RabbitMQ来解决这个问题。您可以为每个worker维护4个不同的队列。每个worker将被绑定到一个单独的队列。

所以工作线程将一直等待,直到队列中没有消息。只要有消息在您的情况下,一个关键的工人将启动处理完成任务并再次等待下一个键。

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

例如:

  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);
                }
            })
        })
    })
})