【问题标题】:Is it possible to allow waiting in the main thread in javascript是否可以允许在javascript的主线程中等待
【发布时间】:2016-06-22 21:26:29
【问题描述】:

我目前正在使用 Web Workers,出于某些测试目的,如果可以在主线程中等待直到工作人员完成他们正在做的事情,那将是很好的。所以:

主线程 -> 启动worker

主线程 -> 等待工人完成

工人 -> 做一些工作

工人完成。

主线程 -> 做一些事情。

我意识到最正确的方法是在主线程中使用回调,每当工作人员完成时调用该回调,但由于实际原因这不起作用。我在 Java 中制作了类似于 CyclicBarrier 的东西,但是每当我在主线程中调用 barrier.enter() 时,我当然会得到一个错误。因此,我想知道是否有任何设置或类似的设置可以让我暂时阻止主线程。我正在使用 Node btw 运行我的程序。

这纯粹是为了测试目的,我当然不会在生产环境中使用它!

【问题讨论】:

  • AFAIK 暂停 JS 的唯一方法是 alertconfirmprompt 和已弃用的 showModalDialog。或者while(true),但这会冻结浏览器并浪费CPU。
  • 是的,我已经尝试过这些,但它们不适用于我的情况。我需要一些能够真正让我阻止我思考的东西。
  • 简短回答:不。我已经编写了在 javascript 中执行此类操作的代码,并且您基本上需要保留一个数组,其中所有“工人”都可以将自己标记为“完成”,每个显然都初始化为“未完成”。当每个工人标记自己时,您就会有一段代码检查是否每个人都完成了,如果是,则执行后续操作(下一段代码将在您的“等到所有人完成”代码之后)。同样,我已经这样做了,从来没有遇到过问题。
  • 是的,但我似乎无法让它与我正在使用的 qunit 一起工作......
  • 我还没有尝试过,但是可能可以使用由 ServiceWorker 管理的同步 XHR 请求有效地阻塞主线程,该请求可以与异步通信您的其他 WebWorkers 来同步事物。

标签: javascript blocking web-worker cyclicbarrier


【解决方案1】:

如果你坚持不使用事件,你就会把自己置于一个棘手的境地。如果您阻塞主线程,您将无法处理工作人员发送的事件一旦完成。并且工作线程和主线程之间没有其他的通信通道。

或者有吗?您可以创建一个 HTTP 服务器,将所有数据从工作线程中继到主线程。主线程可以在该服务器上create a synchronous HTTP request。同步 AJAX 请求会阻塞主线程,但不会占用 CPU。

【讨论】:

  • 是的,我想这是一个选项,虽然有些复杂。我意识到阻塞主线程我将无法接收事件,但我阻塞它的方式是使用每晚在 firefox 中使用 sharedmemory 实现的循环屏障。因此,每当所有工作人员在其代码中达到某个点时,主线程就会解除阻塞,甚至不会接收到事件!因此,如果主线程可以被阻塞,它应该仍然可以工作。但正如你所说,这似乎是不可能的。
猜你喜欢
  • 2020-03-10
  • 2016-10-06
  • 2017-05-13
  • 2022-08-18
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
相关资源
最近更新 更多