如何防止while循环冻结node.js?

问题描述 投票:2回答:1

描述:我的node.js后台应用程序生成游戏结果依赖于物理引擎的算法。我的node.js后台应用生成游戏结果依赖于物理引擎的算法。服务器快速生成游戏结果,通过物理引擎运行游戏物理。while 循环并发送给客户端。当客户端得到游戏结果时,他们会以60 FPS的速度运行游戏循环,并对这个结果进行动画。


问题是:在生成结果时,循环冻结了node.js。while 循环在生成结果时冻结了node.js。这个应用程序还负责REST API,原因是它也被冻结了,直到REST API被冻结。while 循环会完成游戏结果的生成。
好吧,也许有一些解决方法来运行 while 循环?也许可以创建其他进程,从主程序中访问它,或者......??
node.js while-loop nodes do-while freeze
1个回答
2
投票

正如你所发现的,nodejs非常不适合运行超过一两毫秒的计算。它有一个单一的主循环,用来调用回调、事件和等待操作(承诺解决或拒绝)。

如果你从其中一个回调事件什么的调用一个长期运行的函数,它就会阻塞主循环,直到它完成,所以nodejs等待处理下一个操作。这就会让你的应用程序感觉很慢,很卡顿。这种一次一个事件的操作是Javascript所固有的。

有几种方法可以管理这种情况。 到目前为止,最好的方法是想办法让你的客户端代码在用户的机器上运行,来完成像游戏物理学这样的重计算。这意味着重新思考你系统的设计。这也意味着你要让你的用户为你的物理引擎埋单,如果你有很多用户,这总是一个明智之举。

你可以改用轻量级线程的语言来为你的服务器编程。Java和C#是合理的选择,golang也可以。

你可以把你的长期运行的计算拆分开来,异步地进行,就像这样。

async function comp () {
  while (computationNotDone) {
    await doChunkOfComputation()
  }
}

await操作让节点重新激活主循环。你的计算块通过其他事件和回调轮流进行。

你也可以尝试node Worker Threads。解释这些超出了StackOverflow回答的范围。

看看这个 如何防止while循环冻结node.js?

© www.soinside.com 2019 - 2024. All rights reserved.