【问题标题】:Does cron job block the main process or nodejs will create a worker to do cron taskcron作业会阻塞主进程还是nodejs会创建一个worker来执行cron任务
【发布时间】:2015-08-02 10:21:44
【问题描述】:

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

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');

【问题讨论】:

    标签: node.js process cron backgroundworker cron-task


    【解决方案1】:

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

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

    希望这会有所帮助.. 干杯

    【讨论】:

    • 我不这么认为。依赖项中没有 node-worker。
    • 你是对的,不存在依赖关系,正在查看其他名为 cron 的 nodejs 库:npmjs.com/package/cron.. 无论哪种方式,我的第二个参数都是有效的。请如果您可以按照建议进行测试,以便您可以从中得出一些结论:)。我相信您可以通过这种方式解决这个问题。希望对您有所帮助
    【解决方案2】:

    任何阻塞操作都会阻塞主线程,至少在node-cron.

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

    // app.js
    ...
    
    /* Routes */
    
    app.use("/", valueRoutes);
    
    /* Cron Job */
    
    cron.schedule(CRON_EXP, refreshData); // long running asyn operation
    
    export default app;
    

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

    【讨论】:

    • 可能是因为超时/睡眠部分在另一个线程上,但是当你的方法 refreshData 被调用时 - 它在主线程上?
    【解决方案3】:

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

    在内部,node-cron 在 setTimeout 内异步执行给定的功能。 但是如果在你的函数内部,如果你做一些阻塞 io,作为一个 for,它会阻塞你所有的线程。

    【讨论】:

      【解决方案4】:

      首先,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 作为作业调度程序是否使用此功能。

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

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

      【讨论】:

        猜你喜欢
        • 2016-03-01
        • 2010-10-25
        • 1970-01-01
        • 2012-01-09
        • 2017-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        相关资源
        最近更新 更多