Javascript.Javascript中如何实现多线程?javascript中如何实现多线程?

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

我正在构建一个小型的双人游戏应用。从一个玩家向另一个玩家实时发送数据是非常重要的,为此socket看起来很有前途。

我在一些地方看到,javascript不支持多线程。那有什么办法可以解决两边的通信,因为需要两个线程来并行管理C1->C2和C2->C1的通信。

我的高层架构是这样的

enter image description here

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

javascript html multithreading web communication
1个回答
2
投票

一个JavaScript程序使用 "运行到完成 "的语义在单线程上运行。

在其他语言中通常会阻塞的操作是非阻塞的,只是简单地交给主机(在这种情况下,浏览器),并通过事件异步地通知你的程序进展。

当主机提出一个事件让你的程序去处理时(例如,一个入站消息),它将该事件的通知作为一个 "作业 "放在队列中。当该作业到达队列的前面时,一旦调用栈为空(即当前正在运行的脚本已经运行完成),JavaScript运行时就会去掉该作业的队列,并调用与之相关的继续函数(即你的程序中被配置为处理该事件的部分)。

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

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

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

对于长期运行的、计算成本高的任务,你可以使用 "多任务"。工人API 来创建新的执行线程,你可以用受控的方式与之通信,但你可能在这里不需要这个。

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

相关问题 此处, 此处, 此处, 此处此处.

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