2012-06-14 33 views
3

是否可以取消處理由worker.postMessage(..)調用的單個動作? 有worker.terminate()方法,但它取消了任何等待事件。此外,它似乎使整個工作人員死亡,因爲它不會對進一步postMessage呼叫作出反應。取消單個Webworker事件

在另一方面,它似乎沒用創建一個新的Worker每個任務,如果他們在大量的公共數據,而必須從Worker通過主腳本運行到Worker的操作,克隆整個數據每次。

+0

看來這是不可能的設計。原因可能是取消的webworker可以在任何內部狀態下終止,從而使其數據處於未定義狀態。通過殺死整個webworker,不可能訪問這些數據。如果另一個事件可能再次運行web worker,它將再次訪問錯誤狀態。 – dronus

回答

1

如果通過postmessage將標記x設置爲'暫停'特定處理作業,直到通過postmessage指定了綠燈,您需要爲您的代碼指定一個kickstart以再次開始處理。

不好的javascript不支持指針,否則你不會有內存問題。

+1

我認爲問題不在於沒有'指針',而在於'工作者'的設計方式:除了'postMessage'的消息隊列之外,他們不與另一個線程共享任何內容。所以他們規避了其他語言和虛擬機需要注意的大量問題。 – dronus

+1

這實際上是正確的解決方案。 –

+0

謝謝@JanPöschko的確認:-D – Tschallacka

3

確實worker.terminate()殺死了線程。由於WebWorkers有相當多的內存和CPU開銷,這個事實可能會很昂貴。

處理取消單個事件的方法將在postMessage回調中承載某種控制器邏輯。您的工作人員可以擁有狀態,因此您必須在內部跟蹤該狀態,並使用該信號停止或啓動進程。

一種方法可能是創建一個共享Worker,甚至可以在各個選項卡上使用,然後讓該共享工作人員在必要時處理其他線程。

+0

因此,我需要注入任何代碼,可能運行一段時間停止條件開關?這意味着修改任何運行cylces的循環都取決於給定的輸入數據,例如第三方庫代碼。我認爲共享工人也不會改變任何事情。 「旋轉其他線程」意味着再次複製整個內部數據,這是我的主要問題。 – dronus