当前位置: 首页 > 知识库问答 >
问题:

如何让NodeJS应用程序永远运行(不是永远模块)

龚玄天
2023-03-14

在其他语言中,此任务很简单,只需在Python中使用类似以下内容:

while True:
    # Program logic that will run forever
    time.sleep(5) # Make the program wait for a few seconds

如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。

我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。

我认为永久npm模块不太合适,因为该模块只是检查脚本是否正在运行,如果没有,它将重新启动它并将任何标准错误或输出报告给文件。

while(true){
   db.dataqueue.find({processed: 0}).count((err, count) => {
      if(count == 0){
          //Sleep here or don't check the db again for a while
      }else{
          //Do the processing on the datas and make files. Another database find.count
          //call should not happen until the queue is processed.
      }
}

我不确定如何让它Hibernate,因为mongojs的回调不会影响while循环。我已经看到了这样做的promise,并使这个async的父函数可能工作,但我不明白如何从这个答案实现它:如何在不影响其他线程的情况下睡眠node.js中的线程?

此外,我还考虑过用setInterval或setTimeout替换while(true)以使程序持久化。这篇文章有助于理解事件循环。

共有1个答案

左丘成仁
2023-03-14

多亏了Paulpro告诉我我走在正确的轨道上,我找到了解决这个问题的方法。首先,我切换到使用支持promise的mongoist,然后我使用新的异步和等待语法来获得所需的结果:

const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
getToProcessCount();
async function getToProcessCount(){
    while(true){
         const datacnt = await db.queue.count({processed: 0});
         console.log(datacnt);
         if(datacnt == 0){
             console.log("Nothing to do, sleep for a while");
             await snooze(2000);
             console.log("I just woke up");
         }
         else{
             console.log("Do some processing here");
         }
     }
 }

async函数允许这种类型的函数暂停执行并等待promise返回,这在处理数据库查询并以同步格式编写时非常有用。await关键字将暂停执行,直到promise实现,它实际上返回数据,这就是为什么我能够从mongodb集合中获得记录计数,并在下一行中输出它。

我的另一个要求是,如果没有任何数据要处理,就强制程序暂停,这样它就不会不断地向数据库发送一堆查询,这就是贪睡函数所做的。重要的是要注意贪睡函数前面的等待,否则贪睡将被执行,下一行将立即运行。

这段来自Fun-Fun Function的视频真的帮助我理解了异步函数和等待语法。

 类似资料:
  • 有没有办法让BeaconTransmitter实例永远发送? 问题是:我想要一个RPi检测器,当我回家时,不需要Wifi运行,或者RPi甚至可以访问互联网(例如,当它检测到电话时,它可以打开所有路由器等)。 我的android手机上有一个极简的应用程序,发送iBeacon运行,而RPi上的beacontools库会检测到它。原则上,这是运作良好的。(虽然我知道它应该是相反的,但我再次,我希望RPi

  • 问题内容: 有什么办法可以使这两个软件包一起运行? 因此,基本上,我希望两全其美。自动运行服务器(并在出现错误时重新启动),并在发生.js文件更改时自动更新。 问题答案: 但是要避免该问题,您可以执行以下操作: 这样可以确保实际退出(而不是给您“应用程序崩溃”消息),然后再次将其接收。 在此指定要运行的命令,否则将默认为节点。不使用-c会导致在此答案的注释中提及的错误。

  • 我正在使用PHP mongoClient类连接mongob远程主机。 除了简单的连接代码,我没有写什么特别简单的东西。 它确实连接到mongodb,但一段时间后,我的应用程序挂起,所谓挂起,是指php sript永远运行,没有响应,最后apache和我的服务器崩溃。我需要重启服务器才能重新启动。 为什么PHP脚本永远运行而mongolerver没有响应。 我将设置为30秒。 MongoClient

  • 我有一个奇怪的问题Laravel队列:工作。在我的crontab中,我设置了一个工作,就像Laravel文档中描述的那样 在我的应用程序/控制台/Kernel.php我设置这个: 在我的正式服php工匠队列中:工作运行几秒钟,然后被“杀死”。这就是我所期望的。 在我的开发盒php artisan队列中:工作永远运行。因此,激活cron作业会产生php进程,直到整个内存被填满。 两个盒子都是Cent

  • 问题内容: 在Debian服务器上,我安装了Node.js。我了解如何使用以下命令行从腻子启动应用程序: 并通过地址(IP和端口)访问它。 但是,一旦我关闭腻子,那我就无法到达地址了。 如何使Node.js应用程序永久运行? 如您所料,我是Linux和Node.js的初学者。 问题答案: 尽管其他答案解决了OP的问题,但它们都是过大的,不能解释为什么他或她遇到此问题。 关键是这一行,“我关闭油灰,

  • 问题内容: 我正在使用Flask-WTF: 这是我的表格: 这是控制器: 现在的问题是,如果您查看我的打印语句,它将始终打印已提交的内容,但从不打印有效的内容,并且永远不会执行validate_on_submit()。为什么? 问题答案: 您没有在HTML表单中插入CSRF字段。 添加到模板(docs)后,表单将按预期验证。 验证表单后添加,以查看出现的错误。 在验证之前将为空。在这种情况下,会出