[英]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.