使用Node.JSdevise机器人,运行时随机超时和一个共同的例程

我想用Node.JS来devise一些机器人。 这是这些机器人的要求:

  • 有多达10个“机器人”。 我不知道如何在NodeJS中做到这一点,考虑到它的单线程,我假设是否有10个asynchronous的工作项,这将代表10'机器人'?
  • 机器人执行基本的REST任务,如POST到远程服务器。 假设每个POST都是成功的(或者假设我们不在乎是否有失败)。 虽然远程服务器是相同的,function是相同的(POST),但参数可能有变体,每个机器人将提供可变参数,如负载到POST
  • 机器人应该在发射任务之前通过随机睡觉K秒来模拟人类的行为。 然后在执行另一个任务之前,它自己排队等待k秒。 这增加了一个复杂的程度,我不能包裹我的头 – 如果我使用睡眠/超时function,如setTimeout或setInterval将这10名工人并行睡眠或连续睡眠。 如果他们连续睡觉,那么我没有10个机器人,而是我有10个连续的工作人员按顺序排队!

到目前为止我所尝试过的:既然我是NodeJS的新手,我还没有find正确的方法来处理这个问题。

  • 我查看了一个工作队列的beanstalkd ,但是用户服务将序列化地显示出序列
  • 我目前正在评估async.parallel,但似乎并行是一个'障碍',所有并行作业将进行到下一个迭代,只有在所有并行作业完成并行执行的function后,但在我的情况下,我想,例如,即使机器人7在其第一次迭代中处于长时间睡眠状态,也要重新执行机器人3并在其第二次迭代中睡觉

这是一个非常简单的框架:

var bot = { act: function() { //make post request here var delay = Math.random() * 500; /*set random delay to mimic human */ setTimeout(this.act.bind(this), delay); } } var bots = []; for (var i = 0; i < 10; i++) { bots.push(Object.create(bot)); } bots.forEach(function(bot) { bot.act(); }); 

我们有一个主bot模板, botvariables。 bot.act是一个会发送POST请求的函数,然后在延迟之后设置超时。 剩下的只是样板,在列表中join10个机器人,并启动每个机器人。 这真的很简单…没有工作队列,没有asynchronous平行…

javascript的asynchronous性质意味着当每个“机器人”正在hibernate时,它不会阻止并导致其他机器人进入hibernate状态。 例如,在这个代码中:

 'use strict'; var start = Date.now(); var printTime = function() { console.log(Date.now() - start + 'ms'); }; setTimeout(function() { printTime(); }, 500); setTimeout(function() { printTime(); }, 1000); 

应该打印(大约):

 500ms 1000ms 

而不是:

 500ms 1500ms 

像这样的东西应该工作得很好:

 'use strict'; var fetch = require('node-fetch'); // Each bot waits between 5 and 30 seconds var minDelay = 5000; var maxDelay = 30000; var numBots = 10; var botTask = function() { fetch('http://somewhere.com/foo', { method: 'POST', body: 'a=1' }); }; var getDelay = function() { return minDelay + Math.random() * (maxDelay - minDelay); }; var runBot = function() { setTimeout(function() { botTask(); runBot(); }, getDelay()); }; for (var i = 0; i !== numBots; i++) { runBot(); }