首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程javascript

多线程javascript
EN

Stack Overflow用户
提问于 2015-11-22 17:10:54
回答 2查看 359关注 0票数 0

我想要创建一个真正的线程来管理javascript中的一些操作。经过几次搜索,我找到了“网络工人”、“setTimeout”或“setInterval”。

  • 问题是‘Workers’不能访问全局变量,因此不能直接修改全局数组(或者我不知道如何修改)。
  • “setTimeout”并不是我真正需要的。
  • “setInterval”给我带来了麻烦,不过,可能是经过多次操作后,我的操作可以持续更长时间。因此,恐怕两个间隔重叠。

最后,我需要一个无限循环,它一个接一个地执行一系列操作。它是否存在,还是我必须满足于'setInterval'?是否有jQuery或其他的替代方案?如果不是,那么在不久的将来,我能期待开发人员提供它吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-22 17:25:52

我假设你是在网络浏览器里说的。

web浏览器中的JavaScript只有一个主UI线程,然后是零或多个web工作线程。Web工作人员确实与主UI线程(以及彼此)隔离,因此无法访问全局(除了他们自己的)。这是有意的,它使实现环境和使用它大大简化,减少了错误的发生。(即使没有强制隔离,多线程编程也是很好的做法。)您通过postMessagemessage事件向web工作者发送消息,并从他们那里接收消息。

JavaScript线程(主UI线程和任何web工作者)通过特定于线程的任务队列(也称为“作业队列”)工作:任何需要在JavaScript线程上发生的事情(页面加载、事件处理、计时器回调时的代码初始运行)都会将任务添加到队列中。JavaScript引擎运行一个循环:获取下一个任务,运行它,拾取下一个任务,运行它,等等。当没有任务时,线程会安静地等待任务到达。

setTimeout不创建单独的线程,它只是调度一个任务(对回调的调用),以便在延迟(超时)之后添加到该线程的任务队列中。一旦超时发生,任务就会排队,当任务到达队列前面时,线程将处理它。

setIntervalsetTimeout完全一样,但是安排了一个经常性的回调:一旦超时发生,它就会排队,然后设置另一个超时,以便稍后再对任务进行排队。(围绕时间的规则有点复杂。)

如果您只想让某件事情永远地、隔一段时间重新出现,并且希望它能够访问主UI线程中的全局变量,那么您可以:

  1. 使用setInterval once,它将设置对代码的重复调用,或
  2. 使用setTimeout,每次您得到回调时,再次使用setTimeout来调度下一个回调。

根据您的描述,听起来您可能不止一次地调用setInterval (例如,每次回调),当您不断告诉它要做越来越多的工作时,它很快就会陷入线程的泥潭。

票数 3
EN

Stack Overflow用户

发布于 2015-11-22 17:24:20

最后一件事很容易:当网络工作者收到消息到(onmessage)时就开始工作,否则就无所事事。(当然,这是高度简化的)。

全局变量对于真正的多线程是不好的,更糟糕的是,JavaScript提供了更少的东西。你必须重写你的工人,使其独立工作,只需提供信息。

子工作人员有一个消息传递系统,您可以很好地利用这个系统。

但是JavaScript的主要问题是:一旦异步,总是异步的。没有办法“加入”线程或"wait4“或类似的东西。唯一能做到这两种功能的是XMLHttprequest,所以您可以在you服务器上这样做,但我怀疑导致的滞后会有什么好处。顺便说一句:同步XMLHttprequest是不推荐的,Mozilla说,它还有一个页面,列出了所有需要同步请求的地方,或者至少非常有用的页面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33857621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档