在其他语言中,此任务很简单,只需在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.
}
}
我不确定如何让它睡眠,因为来自mongojs的回调不会影响while循环。我已经看过这样做的承诺,并使这个异步的父函数可能工作,但我不知道如何从这个答案实现它:How to sleep the thread in node.js without affecting other threads?
此外,我还考虑过用setInterval或setTimeout替换while(true)以使程序持久化。 This article has been helpful in understanding the event loop.
答案 0 :(得分:0)
我已经找到了解决方案,感谢Paulpro告诉我自己走在正确的轨道上。首先,我转而使用支持promises的mongoist,然后我使用新的async和await语法来获得所需的结果:
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关键字将暂停执行,直到履行完成并且它实际返回数据,这就是为什么我能够从mongodb集合中获取记录数并将其输出到下一行。
我的另一个要求是,如果没有任何数据需要处理,则强制程序暂停,这样它就不会经常向数据库发送一堆查询,这就是贪睡功能的作用。重要的是要注意在贪睡功能前面的等待,否则将执行贪睡并立即运行下一行。
This video from Fun Fun Function确实帮助我理解了异步函数并等待语法。