javascript - Javascript:如何在 javascript 中实现多线程?
问题描述
我正在构建一个小型的两人游戏应用程序。将数据从一个玩家实时发送到另一个玩家是非常重要的,因为套接字看起来很有希望。
我在一些地方读到 javascript 不支持多线程。那么双方通信的可能解决方案是需要两个线程来并行管理 C1->C2 和 C2->C1 通信。
我的高级架构看起来像
网页中的javascript如何管理三个线程?一个用于 C1 到 C2 的消息传输,第二个用于 C2 到 C1 的消息传输,第三个用于用户界面?
解决方案
JavaScript 程序使用“运行到完成”语义在单个执行线程上运行。
通常会在其他语言中阻塞的操作是非阻塞的,并且只是移交给主机(在本例中为浏览器),您的程序通过事件异步通知进度。
当主机引发要由您的程序使用的事件(例如入站消息)时,它会将有关该事件的通知作为“作业”放入队列中。当该作业到达队列的最前面,并且调用堆栈为空(即当前正在运行的脚本已经运行到完成)时,JavaScript 运行时会将该作业出列并调用与其关联的延续函数(即。配置为处理事件的程序部分)。
您的游戏将通过网络发送消息(例如通过 WebSocket)。您的程序将简单地将每条消息交给浏览器。这个过程在计算上并不昂贵或耗时。该浏览器是多线程的,将为您处理低级且耗时的网络问题。
JavaScript 是一种基于事件的语言。如果您希望收到与您发送的消息相关的未来事件的通知,那么您可以提供一个回调(或使用承诺)以在未来的适当时间由运行时调用,而不是简单地等待它。这样,执行主线程上的可用时间就得到了有效利用。
您的游戏循环可能会使用requestAnimationFrame
. 这为您提供了每帧大约 16 毫秒的计算时间。游戏状态的计算可能需要几毫秒。处理计划和基于时间的事件可能需要另外几毫秒。最后渲染也需要一些时间。实际上,您的程序在单个执行线程上协同执行多项任务。
对于长时间运行、计算量大的任务,您可以使用Worker API创建新的执行线程,您可以以受控方式与之通信,但在这里您可能不需要它。
网上已经有很多关于这个话题的信息。搜索“事件循环的工作原理”。
推荐阅读
- javascript - 为什么我的 POST 方法在 Angular 中不起作用
- python - 如何在django中获取本地IP而不是公共IP?
- r - 排除 r 中的参与者
- javascript - 如何找到唯一的四叉树对?
- python - 将 UTC 时间转换为 12 小时格式
- bash - 将 Bash shell 变量传递到 AppleScript 文件中
- javascript - 如何在 querySelectorAll 的过滤函数中引用“this”?
- python - Django 过滤器 has_key 生成错误的 SQL
- pandas - 如何将 Spark 数据框中的字符串类型列转换为 Pandas 数据框中的字符串类型列
- python - 使用 conda-build 构建 conda 包时如何包含 pip-only 包?