gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:41:28 26 4
gpt4 key购买 nike

我正在构建一种服务(游戏),其中一组用户将位于一个房间中,该房间将在一定的持续时间(例如30秒)内通过每个用户做出选择。如果用户在此期间内未做出选择,则服务将自动为该用户生成选择。如果在持续时间完成之前做出选择,则下一个用户启动,计时器应重置。

一次可能有成百上千个这样的房间/游戏。

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

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

我还可以使用celery,并使用相同的方法为我的消息代理提供延迟的任务。

对于Javascript,类似于python的第一个解决方案,我可以根据需要生成尽可能多的setTimeouts,但是问题是所有超时都在主线程上起作用,但是就像我说的那样,任务不是资源密集型的,我只需要对第二。

这些是我迄今为止介绍的唯一解决方案,我想知道哪种解决方案最好,并且对其他解决方案也开放。

最佳答案

Node.js计时器非常有效地实现。它们的实现(在有关它们如何工作的详细文章中进行了介绍)可以轻松处理非常多的计时器。

它们被保存在一个双向链表中,该链表已排序,只有下一个要触发的计时器才具有与之关联的实际libuv系统计时器。当该计时器启动或被取消时,列表中的下一个计时器将变为附加到实际libuv系统计时器的计时器。设置新的计时器后,它将被插入已排序的列表中,除非它成为要触发的下一个计时器,否则它将仅位于列表中等待下一个计时器。您可以非常高效地拥有成千上万个此类文件。

以下是有关这些计时器如何工作的一些资源:

How many concurrent setTimeouts before performance issues?

How does nodejs manage timers internally

第一个引用文献包含来自实际nodejs代码的大量注释,这些注释描述了计时器链表系统的工作方式以及针对其进行了优化的内容。

第二篇文章为您提供了有关其组织方式的更高层​​次的描述。

还有其他效率,因此当一个计时器到达列表的开头并触发时,然后在调用该回调之后,node.js会检查列表的开头是否有其他现在也准备触发的计时器。这将清除所有具有与第一个相同的“目标时间”的其他计时器,以及所有其他在运行这些其他回调时到期的计时器。

当您有数千个计时器时,如果其中有很多计时器,则将新计时器插入到已排序的链表中会花费稍长的时间,但是一旦插入,几乎没有多少意义,因为它只是在查看下一个要开火。因此,坐在那里等待成千上万个计时器的过程只是一个系统计时器(代表要触发的下一个计时器事件)和一堆数据。所有其他 future 计时器的数据都不会花您任何钱。

For Javascript, similar to the python's first solution, i could spawn as many setTimeouts as necessary, but the problem is that all timeouts work on the main thread, but like i said, the tasks are not resource intensive and I only need accuracy to the second.



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

请记住,Javascript计时器不保证准确性。如果使CPU陷入困境,则某些计时器的启动时间会比计划的晚,因为它们不是抢占式的。但是,如果您的任务不占用大量CPU,那么您可能会很好。

关于node.js - 在设置大量计时器或使用计划的任务队列之间寻找解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59655705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com