2016-07-14 2 views
0

기사를 많이 읽고, 그러나 그 중 어느 것도 방법 subworker를 만드는 명확한 대답을하지? 내가 알 수있는 바와 같이 올바른 webworker에서 그것을 할 수있는 방법이있다, 그러나 스크립트 주입의 더 많은 것 같다 비록 내가 찾은 유일한 방법은,)의 InstallScript (입니다. Ca는 누군가 하나를 만드는 방법과 근로자가 각각의 다른 사람들 사이에서 의사 소통하는 방법에 대한 예제를 공유합니까?하위 작업자를 만드는 방법은 무엇입니까?

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

메시지는 작업자 내에서 예컨대 subworker 동일한 방식으로 전송된다

답변

1

subworker 정확히 통상 전용 작업자가 생성되는 것과 동일한 방식 스폰

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

당신은 https://html.spec.whatwg.org/multipage/workers.html#delegation에서 예를 찾을 수 있습니다 (포함합니다. 테스트 할 수있는 링크). 그러나 순간에 subworkers을 지원하는 유일한 브라우저 파이어 폭스에지 있습니다. 크롬, 사파리, 오페라 및 안드로이드 브라우저 (Nougat)는 불행히도 멀티 코어 시스템의 성능을 향상시키는 데 크게 도움이되지만이 기능을 구현하지는 않습니다.

크롬의 7 살짜리 issue에 따르면, 그들은 사양의이 부분을 구현하는거야 가능성이 보이지 않는다. 당신이 브라우저 호환성을 유지하려면

는 유일한 방법은 등을 메시지를 다시 라우팅 모든 (또한 DOM/UI를 관리하는) 메인 쓰레드에서 노동자와 부담을 산란하는 것입니다.

하위 작업자를 생성하고 메시지를 앞뒤로 보내는 작업자를 만들고자한다고 가정하면 처리기를 의사 작업자 (별도 스레드가 아닌)로 변경할 수 있지만 코드 변경은 최소로 유지하십시오 "처리기"의 상단에이 코드를 추가하고 물론 new PseudoWorker(); 대신 new Worker("handler.js"); (그것을 인스턴스화하여 당신은 클래스를 찾을 수 있습니다 귀하의 웹 페이지에 "handler.js"에 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에서 일반 작업자로 다시 전환 할 수 있습니다.

관련 문제