【问题标题】:Yielding in a web worker - is setTimeout enough, or must I exit too?在网络工作者中屈服 - setTimeout 是否足够,或者我也必须退出?
【发布时间】:2014-05-01 19:15:03
【问题描述】:

在我的网络工作者中,我必须在一个循环中进行大量处理。在 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;
}

以上内容不适用于网络工作者。当主循环在上面运行时,后续的 postMessage() 调用将被处理。

我可以执行以下操作(现在在打字稿中):

// 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() 会产生吗?或者它只是在我目前正在执行的处理结束后排队等待该调用?

【问题讨论】:

  • it 从哪里获取项目?
  • 所以你想从另一个 postMessage 处理程序调用abort() 来拦截“循环”?
  • @Bergi - 不,我只想调用 yield 所以在处理一个 postMessage 的过程中我可以得到另一个。

标签: javascript typescript settimeout web-worker


【解决方案1】:

我已经运行了一些测试,我相信答案是你必须退出你所在的方法。setTimeout() 队列在方法上,但在 web worker 中没有任何东西运行之前不会运行它。

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多