使用Node.JS设计机器人,使用随机超时和常规例程运行

时间:2016-02-22 03:24:41

标签: javascript node.js parallel-processing

我想使用Node.JS设计一些机器人。以下是这些机器人的要求:

  • 最多有10个'机器人'。我不知道如何在NodeJS中这样做, 考虑到它的单线程,我假设是否有10个工人 异步的项目,代表10 '漫游'?
  • Bots执行基本的REST任务,例如POST到远程服务器。假设每个POST都成功(或假设我们不关心是否有失败)。虽然远程服务器是相同的并且功能相同(POST),但参数中可能存在变体,并且每个机器人将提供变量参数,例如有效负载到POST
  • Bots应该通过在开火任务之前随机休眠几k秒来模拟人类行为。然后它在执行另一个任务之前将自己排队等待另一个k秒。这增加了我无法解决的复杂程度 - 如果我使用像setTimeout或setInterval这样的睡眠/超时功能,则会有10个这样的工作者并行睡眠或连续睡眠。如果他们连续睡觉然后我没有10个机器人,而是我有10个连续工作人员按顺序排队!

到目前为止我尝试了什么: 由于我是NodeJS的新手,我还没有能够准确找到解决这个问题的正确方法。

  • 我查看了beanstalkd这是一个工作队列,但它似乎是连续的消费者服务将按顺序订购项目
  • 我目前正在评估async.parallel,但似乎并行性是一个“障碍”,只有在所有并行作业完成并行执行的功能之后,所有并行作业才会进入下一次迭代,但在我的例如,我想,即使机器人7在第一次迭代中长时间睡眠,机器人3也要重新排队并在第二次迭代时睡觉

2 个答案:

答案 0 :(得分:2)

javascript的异步性质意味着当每个“机器人”时都会出现这种情况。正在睡觉它没有阻止并导致其他机器人睡觉。例如,在此代码中:

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

答案 1 :(得分:1)

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

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变量。 bot.act是一个发送POST请求的函数,然后在延迟后设置自身超时。其余的只是样板,在列表中添加10个机器人,并启动每个机器人。它真的那么简单......没有工作队列,没有异步并行......