在web worker中生成- setTimeout是否足够,或者我也必须退出
Yielding in a web worker - is setTimeout enough, or must I exit too?
在我的web worker中,我必须在循环中做大量的处理。在c#或Java世界中,我会这样编码(Java):
// main code:
public static void mainLoop() {
for (Iterator it=getIterator(); it.hasNext() && keepRunning; ) {
Object item = it.next();
processThisOne (item);
}
}
// async method
static boolean keepRunning = true;
public static void abort() {
keepRunning = false;
}
以上内容在web worker中不起作用。当主循环在上面运行时,后续的postMessage()调用将被处理。
我可以做以下操作(现在在typescript中):
// kicked off by postMessage event handler
public mainLoop () : void {
if (! keepRunning)
return;
Object item = it.next();
processThisOne (item);
worker.setTimeout(mainLoop, 0);
}
// also callable by postMessage event handler:
static boolean keepRunning = true;
public static void abort() {
keepRunning = false;
}
相反,我基本上可以按如下方式生成吗?如果是这样,这是否很快(在setTimeout上线程之间有任务切换)?
// kicked off by postMessage event handler
public mainLoop () : void {
for (Iterator it=getIterator(); it.hasNext() && keepRunning; ) {
Object item = it.next();
processThisOne (item);
// yield
worker.setTimeout(nothing, 0);
}
}
// called by setTimeout:
public static void nothing() {
}
// also callable by postMessage event handler:
static boolean keepRunning = true;
public static void abort() {
keepRunning = false;
}
如果上面的工作,那么我的代码保持简单。问题是,setTimeout()会产生吗?或者它只是在我当前执行的处理结束后排队调用?
我已经运行了一些测试,我相信答案是您必须退出您所处的方法。setTimeout() queue在方法中启动,但在web worker中没有任何东西在运行之前不会运行它。
相关文章:
- 弹出窗口出现,然后退出
- 退出全屏不起作用
- 基于两个条件退出While循环
- 如何删除除冒号、数字和'上午'或者'下午'
- 如何“;过滤器”;或者以其他方式重构该数据
- 如何准确执行加载脚本&退出弹出窗口
- firefox插件:退出不工作的应用程序观察器
- 哪个布尔运算更快<或者<=
- 无法执行文件.退出Acrobat PDF中的操作
- 在编译阶段后创建新的DOM树,或者继续使用原始修改的DOM
- 或者在表单上选择默认选项文本(选择1)
- 如何从Node Webkit应用程序中退出外部CMD文件
- 试图修改此javascript代码以减小弹出窗口的大小,或者在用户单击框外时关闭
- Backbone fetch中的Ajax在fetch调用退出后完成,因此fetch调用中没有成功/失败事件
- 如何在不退出javascript的情况下从javascript更新网页
- JQuery是否有一个“;移动“;作用或者有没有一种更紧凑的方法来做到这一点
- javascript在退出时打开窗口url
- 咖啡'@'或者这在函数和类中
- PHP's退出;在Javascript中
- 在web worker中生成- setTimeout是否足够,或者我也必须退出