[英]Multithreading javascript
我想创建一个真正的线程来管理javascript中的某些操作。 经过几次搜索,我找到了“ Web Workers”,“ setTimeout”或“ setInterval”。
最后,我需要一个无限循环,一次又一次地执行一系列操作。 它是否存在,或者我必须对“ setInterval”感到满意? jQuery或其他工具有替代方法吗? 如果不是这样,我能在不久的将来看到开发人员提供它吗?
我假设您正在使用网络浏览器进行讨论。
Web浏览器中的JavaScript有一个主UI线程,然后有零个或多个Web Worker线程。 Web worker实际上与主要的UI线程(以及彼此)是隔离的,因此无权访问全局变量(除了自己的全局变量之外)。 这是故意的,它使双方实现环境和使用它极大地更简单,更容易出错。 (即使未强制执行隔离,无论如何,这都是多线程编程的好习惯。)您可以通过postMessage
和message
事件向Web Worker发送消息,以及从Web Worker接收消息。
JavaScript线程(主UI线程和任何Web工作者)通过特定于线程的任务队列 (也称为“工作队列”)工作:JavaScript线程上需要发生的所有事情(页面加载时代码的初次运行,处理发生事件时,计时器回调[更多信息请参见下文])将任务添加到队列中。 JavaScript引擎运行一个循环:拾取下一个任务,运行它,拾取下一个任务,运行它,等等。当没有任务时,线程会安静下来,等待任务到达。
setTimeout
不会创建单独的线程,它只是计划在延迟(超时)后将任务(对回调的调用)添加到同一线程的任务队列中。 一旦发生超时,任务就会进入队列,并且当任务到达队列的最前面时,线程将对其进行处理。
setInterval
功能与setTimeout
功能完全相同,但是它安排了重复的回调:一旦发生超时,它将对任务进行排队,然后设置另一个超时以稍后再次将任务排队。 (有关计时的规则有些复杂。)
如果您只是想让某件事永久地,定期地重复出现,并且您希望那件事可以访问主UI线程中的全局变量,那么您可以:
使用一次 setInterval
,它将建立对您代码的重复调用,或者
使用setTimeout
,每次获取回调时,再次使用setTimeout
安排下一个回调。
从您的描述中,听起来好像您可能多次调用setInterval
(例如,在每个回调中),随着不断告诉它执行越来越多的工作,它很快就会陷入困境。
最后一件事很简单:网络工作人员在收到( onmessage
)消息时开始工作,否则闲置。 (当然,这是高度简化的)。
全局变量不利于真正的多线程处理,而如果JavaScript提供的内容减少,则更糟。 您只需要给定信息,就必须重写您的工人以独立工作。
子工作人员具有一个消息传递系统,您也许可以利用它。
但是JavaScript的主要问题是:一旦异步总是异步的。 没有办法“加入”线程或“ wait4”或类似的东西。 唯一能做这两个事情的就是XMLHttprequest
,因此您可以在Web服务器上做到这一点,但我怀疑造成的滞后会带来什么好处。 顺便说一句:Mozilla XMLHttprequest
,不赞成使用同步XMLHttprequest
,它也有一个页面列出了所有需要同步请求或至少非常有用的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.