Javascript:如何在Javascript中实现多个线程?

Javascript:如何在Javascript中实现多个线程?,javascript,html,multithreading,web,communication,Javascript,Html,Multithreading,Web,Communication,我正在构建一个小型的两人游戏应用程序。实时地将数据从一个播放器发送到另一个播放器是非常重要的,因此套接字看起来很有希望 我在一些地方读到javascript不支持多线程。那么,由于需要两个线程来并行管理C1->C2和C2->C1通信,那么对于双方通信来说,什么是可能的解决方案呢 我的高级架构看起来像 javascript如何在一个网页中管理三个线程?一个用于C1到C2消息传输,第二个用于C2到C1消息传输,第三个用于用户界面?JavaScript程序使用“运行到完成”语义在单个执行线程上运行

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

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

我的高级架构看起来像


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

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

通常在其他语言中阻塞的操作是非阻塞的,只需将其传递给主机(在本例中为浏览器),并通过事件异步通知程序的进度

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

您的游戏将通过网络发送消息(如通过WebSocket)。您的程序只需将每条消息传递给浏览器即可。这个过程在计算上并不昂贵或耗时。浏览器是多线程的,将为您处理低级别和耗时的网络问题

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

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

对于长时间运行、计算代价高昂的任务,您可以使用创建新的执行线程,以便以可控的方式进行通信,但此处可能不需要这样做

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


相关问题、和。

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

通常在其他语言中阻塞的操作是非阻塞的,只需将其传递给主机(在本例中为浏览器),并通过事件异步通知程序的进度

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

您的游戏将通过网络发送消息(如通过WebSocket)。您的程序只需将每条消息传递给浏览器即可。这个过程在计算上并不昂贵或耗时。浏览器是多线程的,将为您处理低级别和耗时的网络问题

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

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

对于长时间运行、计算代价高昂的任务,您可以使用创建新的执行线程,以便以可控的方式进行通信,但此处可能不需要这样做

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


相关问题、、和。

单线程将完成所有三个任务。这里没有问题,只要使用socket.io,它就会工作。@ChrisG它在实际执行中是如何工作的?幕后发生了什么?我从未在Java中听到过类似的事情。你熟悉javascript事件循环吗?不,那是什么?我听说过单击、按键等事件。事件循环是浏览器用来决定下一步在绘制页面和运行各种javascript之间运行哪段代码的核心机制。这些单击和按键(以及套接字事件)被添加到队列中,并在下次事件循环到达它们时运行。你可以在谷歌上搜索更多信息,如果你有半个小时的时间,这里有一个关于这个主题的视频:单线程将完成所有三个任务。这里没有问题,只要使用socket.io,它就会工作。@ChrisG它在实际执行中是如何工作的?幕后发生了什么?我从没听说过这样的事