使用 Node.JS 设计机器人,这些机器人以随机超时和通用例程运行
Designing bots using Node.JS, that run with random timeouts and a common routine
我想用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 个机器人添加到列表中,然后启动每个机器人。真的就是这么简单...没有工作队列,没有异步并行...
相关文章:
- $(document).height()在刷新时随机化值(Safari 5.1.10)
- 使用当前日期生成随机id
- 从a-z中随机选择一个字母
- RequireJ无法随机加载脚本
- 单击按钮时显示随机字符串
- Ajax更新面板随机错误'PRM_MissingPanel'
- 如何检查if/else语句中的随机条件
- 是否可以自动拉取“随机”;标签“;从一长串文本中提取
- 如何使用D3生成特定范围内的随机颜色
- 如何在 Javascript/jQuery 中获取一些随机下拉列表的选定值
- 在固定位置显示随机图像
- 有效地获取两个区间之间的随机整数
- 如何获得随机灯光颜色
- 设置随机数,然后每5秒随机减少一次,直到达到0(javascript)
- 阵列中随机图像的问题
- Web编程,简单但适用于机器人项目
- 显示数字,然后每5秒随机更改一次(javascript)
- 使用JS按顺序显示图像,而不是随机显示
- 使用javascript和随机暂停/超时快速循环文本
- 使用 Node.JS 设计机器人,这些机器人以随机超时和通用例程运行