Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.JS设计机器人程序,该程序使用随机超时和公共例程运行_Javascript_Node.js_Parallel Processing - Fatal编程技术网

Javascript 使用Node.JS设计机器人程序,该程序使用随机超时和公共例程运行

Javascript 使用Node.JS设计机器人程序,该程序使用随机超时和公共例程运行,javascript,node.js,parallel-processing,Javascript,Node.js,Parallel Processing,我想使用Node.JS设计一些机器人程序。以下是这些机器人程序的要求: 最多有10个“机器人”。我不知道如何在NodeJS中做到这一点, 考虑到它的单线程,我假设有10个工作线程 异步的项,将代表10个 “机器人” 机器人程序执行一项基本的REST任务,比如向远程服务器发送邮件。假设每个帖子都是成功的(或者假设我们不在乎是否有失败)。虽然远程服务器是相同的,函数也是相同的(POST),但参数中可能有变量,每个bot将提供变量参数,如POST的有效负载 机器人应该在某种程度上模拟人类行为,在启动

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

  • 最多有10个“机器人”。我不知道如何在NodeJS中做到这一点, 考虑到它的单线程,我假设有10个工作线程 异步的项,将代表10个 “机器人”
  • 机器人程序执行一项基本的REST任务,比如向远程服务器发送邮件。假设每个帖子都是成功的(或者假设我们不在乎是否有失败)。虽然远程服务器是相同的,函数也是相同的(POST),但参数中可能有变量,每个bot将提供变量参数,如POST的有效负载
  • 机器人应该在某种程度上模拟人类行为,在启动任务之前随机睡眠约k秒。然后,在执行另一项任务之前,它会将自己再随机排队k秒。这增加了一个我无法理解的复杂程度——如果我使用像setTimeout或setInterval这样的睡眠/超时功能,其中10个工作人员将并行或连续睡眠。如果他们连续睡眠,那么我没有10个机器人,相反,我有10个连续工作者按睡眠顺序排队
到目前为止,我所尝试的: 因为我对NodeJS是新手,所以我一直无法准确地找到正确的方法来处理这个问题

  • 我查看了哪个是工作队列,但消费者服务似乎会连续订购商品
  • 我目前正在评估,但并行性似乎是一个“障碍”,所有并行作业只有在所有并行作业完成要并行执行的功能后才能进行下一次迭代,但在我的情况下,我希望,例如,即使bot 7在其第一次迭代中处于长睡眠状态,bot 3仍将在其第二次迭代中重新排队并睡眠

    • 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
      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();
      });
      
      var bot={
      行动:职能(){
      //在此提出邮寄请求
      var delay=Math.random()*500;/*设置随机延迟以模拟人类*/
      setTimeout(this.act.bind(this),delay);
      }
      }
      var-bots=[];
      对于(变量i=0;i<10;i++){
      推送(Object.create(bot));
      }
      bots.forEach(功能(bot){
      bot.act();
      });
      

      我们有一个主bot模板,
      bot
      变量
      bot.act
      是一个函数,它将发送POST请求,然后在延迟后为自身设置超时。剩下的只是样板,在列表中添加10个机器人,然后启动每个机器人。其实很简单。。。没有工作队列,没有异步并行

      我相信在setTimeout中,对act的调用应该是this.act?否则,我会得到一个“ReferenceError:act未定义”。当我用this.act替换它时,我发现act并不是在循环中运行的!它只运行两次—一次从bot.act开始,然后是act的第一次迭代。有什么想法吗?@nthacker很抱歉,我已经更新了我的答案。我们只需要将超时绑定到当前的bot上下文。谢谢!这太棒了!
      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();
      });