2016-07-14 67 views
0

看了很多文章,但這些都不給出明確的答案如何創建一個subworker?我的理解是有辦法做到這一點右出一個webworker的,但我發現的唯一途徑是INSTALLSCRIPT(),但它似乎更多的是腳本注入的。有人分享一個例子如何創建一個以及工作人員如何在每個人之間進行溝通?如何創建一個子工作?

回答

1

甲subworker被精確地產生了創建正常專用工人相同的方式:

var worker = new Worker("worker.js"); 
worker.onmessage = function(event) { 
    ... 
}; 

和消息也從工人內,例如發送的相同的方式向subworker

worker.postMessage({cmd: 'start'}); 

你可以找到https://html.spec.whatwg.org/multipage/workers.html#delegation一個例子(包括鏈接進行測試)。 但是這在目前支持子Worker唯一的瀏覽器是火狐邊緣。 Chrome,Safari,Opera和Android Browser(Nougat)並沒有實現這個功能,但不幸的是,它可以極大地幫助進一步提高多核系統的性能。

根據一個7歲的issue爲Chrome,它似乎並不可能,他們將實現該規範的這一部分。

如果你想保持瀏覽器的兼容性,唯一的辦法是產卵從主線程所有工人(其中還管理DOM/UI),並負擔其與傳送訊息回一個來回。

假設您想創建一個名爲「處理程序」的工作程序,然後生成子工作程序並來回路由消息,則可以將處理程序更改爲僞工作程序(不在單獨的線程中),但將代碼更改爲最小值通過在「處理程序」的頂部添加此代碼並將其new PseudoWorker();代替new Worker("handler.js");(當然其實例化你必須在你的網頁添加一個JS參考「handler.js」,所以就可以找到類PseudoWorker):

// begin of PseudoWorker wrapper 
var parentOnmessage; 
var PseudoWorker = function() { 
    var initialized = false; 

    this.postMessage = function(msg) { 
     self.onmessage({data: msg}); 
     if (!initialized) { 
      self.parentOnmessage = this.onmessage; 
      initialized = true; 
     } 
    } 
} 

this.postMessage = function(data) { 
    parentOnmessage({data: data}); 
} 
// end of PseudoWrapper - add your code after this line as if this was a normal worker 

唯一要注意的是,該PseudoWorker不會開始工作,它接收到的消息自動但經過而已。這是因爲變量可以正確初始化。 但代碼適用於上述所有瀏覽器。只要瀏覽器支持子工作者,您就可以從PseudoWorker切換回普通工作者。