cron 作业是否阻塞主进程或 nodejs 将创建一个 worker 来执行 cron 任务

Does cron job block the main process or nodejs will create a worker to do cron task

我正在使用 node-cron 每分钟做一些繁重的任务(更新数据库)。这个任务是使用主进程来工作还是 nodejs 会创建一些 worker 来完成这些任务?

var CronJob = require('cron').CronJob;
new CronJob('0 * * * * *', function() {
  //Update database every minute here
  console.log('Update database every minute');
}, null, true, 'America/Los_Angeles');

它应该为你创建一个工人。它在库文档中没有很好的记录但是: 1)你可以在依赖项中看到,它依赖于node-worker。 2) 如果 cron 作业被阻塞,那么等待 cron 作业执行(在本例中为一分钟)也会被阻塞。这是因为主线程会一直等到它不得不这样做。在这种情况下,它将不是 cron 作业,因为它将是一个简单的 sleep() 然后执行。

尽管如此,如果您想确定,请尝试使用 "while true" 做一个 nodejs 主程序,并在里面可能写一些东西来控制台。并制作一个 cronjob,它每分钟都会在您希望的时间执行 sleep() 命令。预期的症状是控制台中的写入永远不会停止..

希望这对您有所帮助.. 干杯

任何阻塞操作确实会阻塞主线程,至少node-cron

我尝试使用 expressjs 应用程序,其中的 cron 作业尝试定期从 Web 获取数据:

// app.js
...

/* Routes */

app.use("/", valueRoutes);

/* Cron Job */

cron.schedule(CRON_EXP, refreshData); // long running asyn operation

export default app;

refreshData方法执行期间,快递应用无法响应请求。

此问题已在此处解决:https://github.com/node-cron/node-cron/issues/114

Internally node-cron performs the given function asynchronously, inside a setTimeout. But if inside your function, if you do some block io, as a for, it'll block all your thread.

首先,node-cron与Node.js优缺点相同,是JavaScript的运行倍,恰好是非阻塞单-使用事件循环的线程语言。

其次,要了解该事实的优点部分,请注意异步任务和同步任务之间存在差异。区别在于任务或代码指令在异步情况下是在程序外部 运行 还是在同步情况下在程序内部 运行 。因此,Node.js 的亮点在于它不会在遇到程序外部 运行 的指令时暂停您的程序执行资源(单个线程)(例如等待结果)像你的情况一样与数据库交互),而是使用事件循环等待来自处理该任务的外部土地的响应,之后它可以根据你挂钩的任何功能(回调)处理结果 运行 收到的结果。直到最近,许多流行的编程语言在等待异步任务时总是会阻塞程序执行资源(您的程序正在使用的线程,尽管它们通常有多个线程),尽管此类任务的执行是在您的程序之外进行的。这就是为什么当您的应用程序与各种外部资源进行大量 i/o 交互时 Node.js 具有高性能,这与异步任务的其他阻塞变体不同,在这些变体中,它们的多个线程在等待时不会被释放,因此会很快被阻塞对于不被他们处理的结果。关于 Node.js 的加号说得够多了。接下来是Node.js.

单线程性质的缺点

第三,Node.js 的单线程性质的缺点来自繁重的同步任务。这些任务需要 运行 在您的程序中进行并且是 CPU 密集型任务,想象一下遍历一个很长的列表或者渲染或处理高保真图形。由于 Node.js 是单线程,因此在处理繁重的同步任务的同时,任何其他请求都必须等到繁重的同步任务完成处理。关于 Node.js 的减号已经说得够多了。接下来就是这个问题的解决方法了。

输入工作线程。从 Node.js v10.5 开始,节点应用 运行 运行在可以被视为主线程的单个线程上,能够协调委托和向其他子进程报告任务线程,每个线程本质上也是 运行 一个独立的单线程 JavaScript 实例。因此,如果遇到 CPU 繁重的任务,您可以让主线程将此类任务委托给子线程,从而使主线程可以为任何其他请求提供服务。接下来要明确node-cron作为job scheduler是否使用了这个特性。

node-cron 不使用 Node.js 的工作线程功能。对于您自己的工作,这不是问题,因为您的工作是异步的。但是,有 bree.js,这是一个非常强大的 Node.js 作业调度程序,它继续使用 Node.js 中的工作线程,我相信您现在知道您将需要类似的东西执行 运行 繁重的同步作业。

最后,当你有繁重的同步任务时,最好探索工作线程,因为虽然 Node.js 支持工作线程,但它不会在需要时自动为你应用。