【问题标题】:How to prevent event loop freeze on Nestjs?如何防止 Nestjs 上的事件循环冻结?
【发布时间】:2020-06-20 20:17:20
【问题描述】:

我正在尝试在 NestJs 中创建异步任务。我希望在向某个控制器发出一个请求后,我的异步任务开始你的长时间工作,而循环,然后节点/嵌套进程钢能够回答其他控制器的其他请求。

但是当异步循环开始时,Nest 的所有其他端点都被冻结,直到异步任务完成。

我已经尝试过使用setTimeout()setInterval()setIntermmediate()queueMicrotask()Promise.resolve()

我的代码:

// Async task:

private checkTime(baseTime: number, startTimeStamp: number){
   while(true){
      const elapsedTime = Date.now() - startTimeStamp
      console.log(`Elapsed time: ${elapsedTime}`)
      if(elapsedTime > baseTime){
          console.log(`Time excced!`)
          break;  
      }
   }
}

我已经尝试过类似的方法:

queueMicrotask(() => this.checkTime(edge.baseTime, startedTimeStamp))

setTimeout(() => this.checkTime(edge.baseTime, startedTimeStamp), 0)

【问题讨论】:

  • 您应该能够只对长时间运行的任务使用异步函数,并且仍然能够处理其他请求。 while(true) 内存占用极快!
  • 感谢您的回答。只需要我将 async 放入我的 checkTIme 吗?您对我可以“观察”某些事情直到发生某些事情有一些建议吗?像秒表
  • Shahrukh 的回答是可行的。你可以使用 Promises 来“等待”某事直到它完成。您的长期运营是什么?如果是加载一个大文件,我会选择 Promises。

标签: javascript node.js asynchronous nestjs


【解决方案1】:

使用javascriptgenerators

代码sn-p:

function* longTask(time = 1000) {
  const startTime = Date.now();
  // divides the long task into smaller chunks
  yield startTime;

 while (Date.now() - startTime < time) {
    // process(): excute a small chunk of the task
    // and yields the control back to the caller
    yield Date.now() - startTime;
  }

}

function completeLongTask(lt) {
  const val = lt.next();
  if (!val.done) {
    setTimeout(() => {
      completeLongTask(lt);
    }, 0);
  }
}

function triggerTask() {
  const lt = longTask();
  completeLongTask(lt);
}

triggerTask();

虽然上述解决方案有效,但我认为您不必为您的用例使用生成器。看看这个更简单的解决方案是否适合您。

function checkTime(baseTime, startTimeStamp) {
  const currentTimeStamp = Date.now();
  const elapsedTime = currentTimeStamp - startTimeStamp;
  console.log(`Elapsed time: ${elapsedTime}`);
  if (elapsedTime > baseTime) {
    console.log(`Time excced!`);
    return;
  } else {
    setTimeout(() => {
      checkTime(baseTime, startTimeStamp);
    });
  }
}

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多