多线程javascript

多线程javascript,javascript,multithreading,Javascript,Multithreading,我想创建一个真正的线程来管理javascript中的一些操作。 经过多次搜索,我找到了“Web工作者”、“设置超时”或“设置间隔” 问题是“Web工作者”无法访问全局变量,因此无法直接修改全局数组(或者我不知道如何修改) “setTimeout”并不是我真正需要的 “setInterval”设置了我的问题,但可能在多次操作后,我的操作可能会持续更长时间。因此,恐怕两个间隔重叠 最后,我需要一个无限循环,它一次接一次地执行一系列操作。它是否存在,还是我必须满足于“setInterval”?jQ

我想创建一个真正的线程来管理javascript中的一些操作。 经过多次搜索,我找到了“Web工作者”、“设置超时”或“设置间隔”

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

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

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

全局变量不适用于真正的多线程,更糟糕的是,JavaScript提供的东西减少了。您必须重写您的工作人员,使其仅使用给定的信息独立工作

子工作人员有一个消息传递系统,您可以充分利用它


但是JavaScript的主要问题是:一次异步总是异步的。没有办法“连接”线程或“wait4”或类似的东西。唯一可以同时完成这两项工作的是
XMLHttprequest
,因此您可以在Web服务器上完成这项工作,但我怀疑由此产生的延迟是否有任何好处。顺便说一句:synchronous
XMLHttprequest
已被弃用,Mozilla说,它还有一个页面,列出了所有需要同步请求或至少非常有用的地方。

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

全局变量不适用于真正的多线程,更糟糕的是,JavaScript提供的东西减少了。您必须重写您的工作人员,使其仅使用给定的信息独立工作

子工作人员有一个消息传递系统,您可以充分利用它


但是JavaScript的主要问题是:一次异步总是异步的。没有办法“连接”线程或“wait4”或类似的东西。唯一可以同时完成这两项工作的是
XMLHttprequest
,因此您可以在Web服务器上完成这项工作,但我怀疑由此产生的延迟是否有任何好处。顺便说一句:synchronous
XMLHttprequest
已被弃用,Mozilla说,它还有一个页面,列出了所有需要同步请求或至少非常有用的地方。

我假设您在web浏览器中谈论的是

web浏览器中的JavaScript只有一个主UI线程,然后是零个或多个web工作线程。Web工作者确实与主UI线程(以及彼此)隔离,因此不能访问全局线程(他们自己的除外)。这是有意的,它使环境的实现和使用都大大简化,并且不容易出错。(即使没有强制实施这种隔离,这也是多线程编程的良好实践。)您可以通过
postMessage
message
事件向web工作人员发送消息,并从他们那里接收消息

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

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

setInterval
的操作与
setTimeout
的操作完全相同,但它会安排一个循环回调:一旦超时发生,它将对任务进行排队,然后设置另一个超时,以便稍后再次对任务进行排队。(有关计时的规则有点复杂。)

如果您只是想让某个东西以一定的间隔永远重复出现,并且希望该东西能够访问主UI线程中的全局变量,那么您可以:

  • 使用
    setInterval
    一次,它将设置回代码的重复调用,或者

  • 使用
    setTimeout
    ,每次收到回调时,再次使用
    setTimeout
    来安排下一次回调


  • 根据您的描述,听起来您可能不止一次地调用
    setInterval
    (例如,每次回调),这会在您不断告诉线程做越来越多的工作时很快使线程陷入困境。

    我假设您是在web浏览器中谈论的

    web浏览器中的JavaScript只有一个主UI线程,然后是零个或多个web工作线程。Web工作者确实与主UI线程(以及彼此)隔离,因此不能访问全局线程(他们自己的除外)。这是有意的,它使环境的实现和使用都大大简化,并且不容易出错。(即使没有强制实施这种隔离,这也是多线程编程的良好实践。)您可以通过
    postMessage
    message
    事件向web工作人员发送消息,并从他们那里接收消息

    JavaScript线程(主UI线程和任何web工作线程)通过特定于线程的任务队列(也称为“作业队列”)工作:JavaScript线程(初始ru)上需要发生的任何事情