Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在设置大量计时器或使用计划任务队列之间寻找解决方案_Node.js_Flask_Redis_Timer_Celery - Fatal编程技术网

Node.js 在设置大量计时器或使用计划任务队列之间寻找解决方案

Node.js 在设置大量计时器或使用计划任务队列之间寻找解决方案,node.js,flask,redis,timer,celery,Node.js,Flask,Redis,Timer,Celery,我正在建立一个服务(一个游戏),其中一组用户将在一个房间里,它将通过每个用户在一定的时间内做出选择(例如30秒)。如果用户在该持续时间内没有做出选择,服务将自动为该用户生成选择。如果在持续时间结束前进行了选择,则下一个用户已启动,计时器应重置 一次可能有数百甚至数千个这样的房间/游戏在进行 我想知道如何实现这一点,我愿意使用Javascript或Python解决方案 对于Python,我考虑从线程库中生成尽可能多的计时器,但不确定其性能影响。所有需要做的就是自动生成一个完全不占用资源的选项,并使

我正在建立一个服务(一个游戏),其中一组用户将在一个房间里,它将通过每个用户在一定的时间内做出选择(例如30秒)。如果用户在该持续时间内没有做出选择,服务将自动为该用户生成选择。如果在持续时间结束前进行了选择,则下一个用户已启动,计时器应重置

一次可能有数百甚至数千个这样的房间/游戏在进行

我想知道如何实现这一点,我愿意使用Javascript或Python解决方案

对于Python,我考虑从线程库中生成尽可能多的计时器,但不确定其性能影响。所有需要做的就是自动生成一个完全不占用资源的选项,并使用SQLAlchemy更新postgres

我也可以使用芹菜,用同样的方法为我的MessageBroker提供延迟任务

对于Javascript,与python的第一个解决方案类似,我可以根据需要生成任意多个
settimeout
,但问题是所有超时都在主线程上工作,但正如我所说,任务不是资源密集型的,我只需要第二个线程的准确性


到目前为止,我只介绍了这些解决方案,我想知道什么是最好的解决方案,并对其他解决方案开放。

Node.js计时器的实现非常高效。它们的实现(在关于它们如何工作的详细文章中描述)可以轻松处理大量计时器

它们保存在已排序的双链接列表中,并且只有下一个要触发的计时器具有与之关联的实际libuv系统计时器。当该计时器触发或取消时,列表中的下一个计时器将成为附加到实际libuv系统计时器的计时器。设置新计时器时,它仅插入到已排序的列表中,除非已启用它是下一个要发射的,它只是在列表中等待轮到它发射下一个。你可以非常有效地拥有数千个

以下是关于这些计时器如何工作的一些参考资料:

第一个参考包含一组来自实际nodejs代码的注释,这些注释描述了计时器链表系统的工作方式以及它的优化目的

第二篇文章对其组织方式进行了更高层次的描述

还有其他效率,因此当一个计时器到达列表的开始并触发时,在调用回调后,node.js会检查列表的前面是否有其他现在也准备好触发的计时器。这将清除具有相同“目标时间”的任何其他计时器“作为第一个,以及在其他各种回调运行时到期的任何其他回调

当你有数千个计时器时,如果在排序的链表中有很多计时器,那么在其中插入一个新的计时器将花费稍长的时间,但是一旦插入,有多少计时器就无关紧要了,因为它只关注下一个要启动的计时器。因此,即使数万个计时器挂起,也只是一个系统计时器(表示要触发的下一个计时器事件)和一组数据。其他未来计时器的所有数据都不会花费你任何东西,只是坐在那里

对于Javascript,与python的第一个解决方案类似,我可以根据需要生成尽可能多的设置超时,但问题是所有超时都在主线程上工作,但正如我所说的,任务不是资源密集型的,我只需要精确到第二个

在我看来,nodejs可以很好地处理您的
setTimeout()
调用量。如果node.js中出现问题,那不是因为计时器的数量,但是如果要处理的工作超过一个内核所能处理的,则必须确保为该问题应用足够的CPU。您可以使用nodejs集群或使用工作线程或其他nodejs进程来帮助处理的工作队列来扩展核心使用。node.js本身对任何与I/O相关的事情都非常有效,因此只要您不进行大量CPU密集型计算,单个node.js线程就可以处理大量事件处理

请记住,Javascript计时器不能保证准确性。如果CPU陷入停滞,一些计时器将比预定时间晚启动,因为它们不是先发制人的。但是,如果您的任务不是CPU密集型的,那么您可能很好