【发布时间】:2016-06-22 21:26:29
【问题描述】:
我目前正在使用 Web Workers,出于某些测试目的,如果可以在主线程中等待直到工作人员完成他们正在做的事情,那将是很好的。所以:
主线程 -> 启动worker
主线程 -> 等待工人完成
工人 -> 做一些工作
工人完成。
主线程 -> 做一些事情。
我意识到最正确的方法是在主线程中使用回调,每当工作人员完成时调用该回调,但由于实际原因这不起作用。我在 Java 中制作了类似于 CyclicBarrier 的东西,但是每当我在主线程中调用 barrier.enter() 时,我当然会得到一个错误。因此,我想知道是否有任何设置或类似的设置可以让我暂时阻止主线程。我正在使用 Node btw 运行我的程序。
这纯粹是为了测试目的,我当然不会在生产环境中使用它!
【问题讨论】:
-
AFAIK 暂停 JS 的唯一方法是
alert、confirm、prompt和已弃用的showModalDialog。或者while(true),但这会冻结浏览器并浪费CPU。 -
是的,我已经尝试过这些,但它们不适用于我的情况。我需要一些能够真正让我阻止我思考的东西。
-
简短回答:不。我已经编写了在 javascript 中执行此类操作的代码,并且您基本上需要保留一个数组,其中所有“工人”都可以将自己标记为“完成”,每个显然都初始化为“未完成”。当每个工人标记自己时,您就会有一段代码检查是否每个人都完成了,如果是,则执行后续操作(下一段代码将在您的“等到所有人完成”代码之后)。同样,我已经这样做了,从来没有遇到过问题。
-
是的,但我似乎无法让它与我正在使用的 qunit 一起工作......
-
我还没有尝试过,但是可能可以使用由 ServiceWorker 管理的同步 XHR 请求有效地阻塞主线程,该请求可以与异步通信您的其他 WebWorkers 来同步事物。
标签: javascript blocking web-worker cyclicbarrier