Javascript:javascript中多线程是如何实现的?
Javascript: How multiple threads are implemented in javascript?
我正在构建一个小型双人游戏应用程序。将数据从一个播放器实时发送到另一个播放器非常重要,因为套接字看起来很有前途。
我读到的一些地方 javascript 不支持多线程。那么双方通信的可能解决方案是什么,因为需要两个线程来并行管理 C1->C2 和 C2->C1 通信。
我的高层架构是这样的
如何在网页中javascript管理三个线程?一个用于 C1 到 C2 的消息传输,第二个用于 C2 到 C1 的消息传输,第三个用于用户界面?
一个 JavaScript 程序 运行 在使用 "run to completion" 语义的单个执行线程上。
在其他语言中通常会阻塞的操作是非阻塞的,只需移交给主机(在本例中为浏览器),您的程序会通过事件异步通知进度。
当宿主引发一个事件供您的程序使用时(例如,入站消息),它会将该事件的通知作为 "job" 放入队列中。当该作业到达队列的前端时,一旦调用堆栈为空(即当前脚本 运行 已 运行 完成),JavaScript 运行time 使作业出列并调用与其关联的延续函数(即配置为处理事件的程序部分)。
您的游戏将通过网络发送消息(例如通过 WebSocket)。您的程序将简单地将每条消息传递给浏览器。这个过程在计算上并不昂贵或耗时。该浏览器是多线程的,将为您处理低级且耗时的网络问题。
JavaScript 是一种基于事件的语言。如果您希望收到与您发送的消息相关的未来事件的通知,那么您可以提供一个回调(或使用承诺)以在将来的适当时间由 运行time 调用,而不是简单地调用等待它。通过这种方式,可以有效地使用执行主线程上的可用时间。
您的游戏循环可能会使用 requestAnimationFrame
。这为您提供了每帧大约 16 毫秒的计算时间。游戏状态的计算可能需要几毫秒。处理计划的和基于时间的事件可能还需要几毫秒。最后渲染也需要一些时间。实际上,您的程序在单个执行线程上协同执行多项任务。
对于长运行宁,计算量大的任务,您可以使用 Worker API 创建新的执行线程,您可以通过这些线程以受控方式进行通信,但您可能不需要这个这里。
网上已有大量关于此主题的信息。搜索 "how the event loop works".
相关问题here, here, here, , and here.
我正在构建一个小型双人游戏应用程序。将数据从一个播放器实时发送到另一个播放器非常重要,因为套接字看起来很有前途。
我读到的一些地方 javascript 不支持多线程。那么双方通信的可能解决方案是什么,因为需要两个线程来并行管理 C1->C2 和 C2->C1 通信。
我的高层架构是这样的
如何在网页中javascript管理三个线程?一个用于 C1 到 C2 的消息传输,第二个用于 C2 到 C1 的消息传输,第三个用于用户界面?
一个 JavaScript 程序 运行 在使用 "run to completion" 语义的单个执行线程上。
在其他语言中通常会阻塞的操作是非阻塞的,只需移交给主机(在本例中为浏览器),您的程序会通过事件异步通知进度。
当宿主引发一个事件供您的程序使用时(例如,入站消息),它会将该事件的通知作为 "job" 放入队列中。当该作业到达队列的前端时,一旦调用堆栈为空(即当前脚本 运行 已 运行 完成),JavaScript 运行time 使作业出列并调用与其关联的延续函数(即配置为处理事件的程序部分)。
您的游戏将通过网络发送消息(例如通过 WebSocket)。您的程序将简单地将每条消息传递给浏览器。这个过程在计算上并不昂贵或耗时。该浏览器是多线程的,将为您处理低级且耗时的网络问题。
JavaScript 是一种基于事件的语言。如果您希望收到与您发送的消息相关的未来事件的通知,那么您可以提供一个回调(或使用承诺)以在将来的适当时间由 运行time 调用,而不是简单地调用等待它。通过这种方式,可以有效地使用执行主线程上的可用时间。
您的游戏循环可能会使用 requestAnimationFrame
。这为您提供了每帧大约 16 毫秒的计算时间。游戏状态的计算可能需要几毫秒。处理计划的和基于时间的事件可能还需要几毫秒。最后渲染也需要一些时间。实际上,您的程序在单个执行线程上协同执行多项任务。
对于长运行宁,计算量大的任务,您可以使用 Worker API 创建新的执行线程,您可以通过这些线程以受控方式进行通信,但您可能不需要这个这里。
网上已有大量关于此主题的信息。搜索 "how the event loop works".
相关问题here, here, here,