首页 > 解决方案 > Javascript:如何在 javascript 中实现多线程?

问题描述

我正在构建一个小型的两人游戏应用程序。将数据从一个玩家实时发送到另一个玩家是非常重要的,因为套接字看起来很有希望。

我在一些地方读到 javascript 不支持多线程。那么双方通信的可能解决方案是需要两个线程来并行管理 C1->C2 和 C2->C1 通信。

我的高级架构看起来像

在此处输入图像描述

网页中的javascript如何管理三个线程?一个用于 C1 到 C2 的消息传输,第二个用于 C2 到 C1 的消息传输,第三个用于用户界面?

标签: javascripthtmlmultithreadingwebcommunication

解决方案


JavaScript 程序使用“运行到完成”语义在单个执行线程上运行。

通常会在其他语言中阻塞的操作是非阻塞的,并且只是移交给主机(在本例中为浏览器),您的程序通过事件异步通知进度。

当主机引发要由您的程序使用的事件(例如入站消息)时,它会将有关该事件的通知作为“作业”放入队列中。当该作业到达队列的最前面,并且调用堆栈为空(即当前正在运行的脚本已经运行到完成)时,JavaScript 运行时会将该作业出列并调用与其关联的延续函数(即。配置为处理事件的程序部分)。

您的游戏将通过网络发送消息(例如通过 WebSocket)。您的程序将简单地将每条消息交给浏览器。这个过程在计算上并不昂贵或耗时。该浏览器是多线程的,将为您处理低级且耗时的网络问题。

JavaScript 是一种基于事件的语言。如果您希望收到与您发送的消息相关的未来事件的通知,那么您可以提供一个回调(或使用承诺)以在未来的适当时间由运行时调用,而不是简单地等待它。这样,执行主线程上的可用时间就得到了有效利用。

您的游戏循环可能会使用requestAnimationFrame. 这为您提供了每帧大约 16 毫秒的计算时间。游戏状态的计算可能需要几毫秒。处理计划和基于时间的事件可能需要另外几毫秒。最后渲染也需要一些时间。实际上,您的程序在单个执行线程上协同执行多项任务。

对于长时间运行、计算量大的任务,您可以使用Worker API创建新的执行线程,您可以以受控方式与之通信,但在这里您可能不需要它。

网上已经有很多关于这个话题的信息。搜索“事件循环的工作原理”。

相关问题在这里这里这里这里这里


推荐阅读