繁体   English   中英

多线程JavaScript

[英]Multithreading javascript

我想创建一个真正的线程来管理javascript中的某些操作。 经过几次搜索,我找到了“ Web Workers”,“ setTimeout”或“ setInterval”。

  • 问题是“ Web Workers”无法访问全局变量,因此无法直接修改我的全局数组(或者我不知道如何)。
  • “ setTimeout”并不是我真正需要的。
  • “ setInterval”设置了我的问题,但是可能很多次后我的操作可能会持续更长的时间。 因此,我担心两个间隔重叠。

最后,我需要一个无限循环,一次又一次地执行一系列操作。 它是否存在,或者我必须对“ setInterval”感到满意? jQuery或其他工具有替代方法吗? 如果不是这样,我能在不久的将来看到开发人员提供它吗?

我假设您正在使用网络浏览器进行讨论。

Web浏览器中的JavaScript有一个主UI线程,然后有零个或多个Web Worker线程。 Web worker实际上与主要的UI线程(以及彼此)是隔离的,因此无权访问全局变量(除了自己的全局变量之外)。 这是故意的,它使双方实现环境和使用它极大地更简单,更容易出错。 (即使未强制执行隔离,无论如何,这都是多线程编程的好习惯。)您可以通过postMessagemessage事件向Web Worker发送消息,以及从Web Worker接收消息。

JavaScript线程(主UI线程和任何Web工作者)通过特定于线程的任务队列 (也称为“工作队列”)工作:JavaScript线程上需要发生的所有事情(页面加载时代码的初次运行,处理发生事件时,计时器回调[更多信息请参见下文])将任务添加到队列中。 JavaScript引擎运行一个循环:拾取下一个任务,运行它,拾取下一个任务,运行它,等等。当没有任务时,线程会安静下来,等待任务到达。

setTimeout不会创建单独的线程,它只是计划在延迟(超时)后将任务(对回调的调用)添加到同一线程的任务队列中。 一旦发生超时,任务就会进入队列,并且当任务到达队列的最前面时,线程将对其进行处理。

setInterval功能与setTimeout功能完全相同,但是它安排了重复的回调:一旦发生超时,它将对任务进行排队,然后设置另一个超时以稍后再次将任务排队。 (有关计时的规则有些复杂。)

如果您只是想让某件事永久地,定期地重复出现,并且您希望那件事可以访问主UI线程中的全局变量,那么您可以:

  1. 使用一次 setInterval ,它将建立对您代码的重复调用,或者

  2. 使用setTimeout ,每次获取回调时,再次使用setTimeout安排下一个回调。

从您的描述中,听起来好像您可能多次调用setInterval (例如,在每个回调中),随着不断告诉它执行越来越多的工作,它很快就会陷入困境。

最后一件事很简单:网络工作人员在收到( onmessage )消息时开始工作,否则闲置。 (当然,这是高度简化的)。

全局变量不利于真正的多线程处理,而如果JavaScript提供的内容减少,则更糟。 您只需要给定信息,就必须重写您的工人以独立工作。

子工作人员具有一个消息传递系统,您也许可以利用它。

但是JavaScript的主要问题是:一旦异步总是异步的。 没有办法“加入”线程或“ wait4”或类似的东西。 唯一能做这两个事情的就是XMLHttprequest ,因此您可以在Web服务器上做到这一点,但我怀疑造成的滞后会带来什么好处。 顺便说一句:Mozilla XMLHttprequest ,不赞成使用同步XMLHttprequest ,它也有一个页面列出了所有需要同步请求或至少非常有用的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM