2015-02-09 57 views
0

我有一個複雜的JavaScript函數可能需要1秒,或許多分鐘發送答案。所以我創建了一個正在工作的Worker,我從Swift中的UIWebView調用了這個函數(stringByEvaluatingJavaScriptFromString)。我只等了5秒鐘(在同一個Javascript中創建了超時),之後我終止了worker(job.terminate()),並且我用其他參數(簡單)啓動了一個不同的參數,答案。事情是,即使在終止信號之後,第一個工人似乎仍在後臺運行。正如您在圖像中看到的那樣,WebCore:Worker具有很多CPU使用率。我怎樣才能徹底終止工人?iOS Javascript Workers終止後高CPU()

enter image description here

job = new Worker("main.js"); 

var t = setTimeout(function(){ 
    stop(); 
    logNode.innerText = 'NULL'; 
},5000); 

function stop() { 
    job.terminate(); 
    job = undefined; 
} 

(main.js):

importScripts('dist/algorithm.js'); 

var lp; 

self.addEventListener('message', function(e) { 
... 
... 

回答

1

終止工人(並確保它)最簡單的方法是將注入一個布爾表達式導致代碼到其主循環的「例外」(如果代碼中只有1或2個瓶頸,甚至可以優雅地返回)。並且可以在讓它自然退出之前在catch塊中執行任何所需的清理。

我個人仇恨與功能,如終止或殺死,因爲它可以在一個不確定的狀態把事情結束線程

終止可能會忽略或排隊等待以後,只是因爲工人正在使用的所有資源它的調用可以不留時間進行消息處理。

+0

謝謝達米安!工作得很好,我在Worker中強制出現異常,並且它真的殺死了這個進程:)非常感謝! – 2015-02-09 06:00:41

+0

在線程上調用終止/停止通常是一種危險的做法,有時會出現不可預知的結果。 – 2015-02-09 06:25:16