簡體   English   中英

屈服於網絡工作者-setTimeout是否足夠,還是我也必須退出嗎?

[英]Yielding in a web worker - is setTimeout enough, or must I exit too?

在我的網絡工作者中,我必須循環執行大量處理。 在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()會產生收益嗎? 還是只是在我當前執行的處理結束后才將請求排隊?

我已經進行了一些測試,我相信答案是您必須退出所使用的方法。setTimeout()排隊使該方法生效,但是直到Web worker中沒有任何運行時才運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM