使用 Node.JS 设计机器人,这些机器人以随机超时和通用例程运行

Designing bots using Node.JS, that run with random timeouts and a common routine

本文关键字:机器人 随机 超时 运行 例程 JS Node 使用      更新时间:2023-09-26

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

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

到目前为止我尝试过:自从我是 NodeJS 的新手以来,我一直无法准确地找到处理这个问题的正确方法。

  • 我研究了 beanstalkd,这是一个工作队列,但消费者服务将按顺序排序项目似乎是串行
  • 的我
  • 目前正在评估 async.parallel,但似乎并行性是一个"障碍",只有在所有并行作业完成要并行执行的功能后,所有并行作业才会进入下一次迭代,但就我而言,我希望,例如,机器人 3 重新排队并在第二次迭代中休眠,即使机器人 7 在第一次迭代中处于长时间睡眠
  • 状态

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

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

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 个机器人添加到列表中,然后启动每个机器人。真的就是这么简单...没有工作队列,没有异步并行...