2016-12-13 3 views
3

저는 자바 스크립트 이벤트 루프 및 웹 작업자와 관련하여 동료와 긴 이야기를 나누었습니다. 하나의 웹 페이지에서 다른 웹 노동자들은 다른 스택, 힙, 메시지 큐, 특히 형태 here 가지고 :자바 스크립트 이벤트 루프 및 웹 작업자

A web worker or a cross-origin iframe has its own stack, heap, and message 
queue. Two distinct runtimes can only communicate through sending messages via 
the postMessage method. This method adds a message to the other runtime if the 
latter listens to message events. 

을하지만 같은 이벤트 루프 내에서 실행되는 모든 메시지는, 또는 각 웹 근무 가지고 그 자신의 이벤트 루프?

페이지에 두 명의 웹 작업자가 있기 때문에 하나는 매우 연산 작업이 많고 다른 작업자는 WebRTC 연결을 처리하기 때문에이 작업을 요청합니다. 세부 사항은 다루지 않겠지 만 계산적으로 무거운 웹 작업자가 자바 스크립트 이벤트 루프에서 계산 시간을 많이 사용하고있는 것으로 보입니다. 다른 작업자는 연결을 유지하기 만하면됩니다 (하트 비트를 통해)이 그렇게 할 수 없으며 결국 연결이 끊어집니다.

이것은 내가 생각하는 것입니다. 그렇지 않은 경우 두 웹 작업자가 서로 다른 이벤트 루프에서 작업하는 경우 컴퓨팅 웹 작업자의 부하가 많은 경우 부하가 가벼운 경우 연결이 끊어지지 않을 때 연결이 끊어지는 이유를 설명 할 수 없습니다.

답변

3

각 작업자마다 고유 한 이벤트 루프가 있습니다. the specification에서 :

WorkerGlobalScope 목적은 관련 유사 출처 브라우징 컨텍스트의 단위로 사용되는 별도의 별개의 이벤트 루프를 가지고 있습니다.

다음 here :

글로벌 범위는 노동자의 "내부"입니다.

... 앞에서 인용 한 WorkerGlobalScope 인터페이스의 정의가 뒤 따른다.

계산 작업량이 많은 작업자가 처리 시간을 지배하고 있지만 다른 작업자의 이벤트 루프를 차단하지는 않습니다.

우리는 또한 쉽게 빠른 테스트로 이것을 확인할 수 있습니다

page.html :

<!DOCTYPE HTML "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Two Workers</title> 
<style> 
body { 
    font-family: sans-serif; 
} 
pre { 
    margin: 0; 
    padding: 0; 
} 
</style> 
</head> 
<body> 
<div>Fast: <span id="fast"></span></div> 
<div>Slow: <span id="slow"></span></div> 
<script> 
(function() { 
    var fastWorker = new Worker("fastworker.js"); 
    var fast = document.getElementById("fast"); 
    var slowWorker = new Worker("slowworker.js"); 
    var slow = document.getElementById("slow"); 

    fastWorker.addEventListener("message", function(e) { 
     fast.innerHTML = e.data || "??"; 
     fastWorker.postMessage("ping"); 
    }); 

    slowWorker.addEventListener("message", function(e) { 
     slow.innerHTML = e.data || "??"; 
     slowWorker.postMessage("ping"); 
    }); 

    fastWorker.postMessage("start"); 
    slowWorker.postMessage("start"); 
})(); 
</script> 
</body> 
</html> 

slowworker.js :

var counter = 0; 
self.addEventListener("message", function(e) { 
    var done = Date.now() + 1000; // 1 second 
    while (Date.now() < done) { 
     // Busy wait (boo!) 
    } 
    ++counter; 
    self.postMessage(counter); 
}); 

fastworker.js :

var counter = 0; 
self.addEventListener("message", function(e) { 
    var done = Date.now() + 100; // 100ms 
    while (Date.now() < done) { 
     // Busy wait (boo!) 
    } 
    ++counter; 
    self.postMessage(counter); 
}); 

보시다시피, "빠름"의 숫자는 "느린"것보다 훨씬 빨리 올라와 메시지 처리 중임을 보여줍니다.

(나는 ... 하나 개의 작업자 파일을 만들어 시작 명령의 지연을 보냈지 만 수도)

+1

는 내가 * 기계 *의 가능한 처리 시간을 지배하는 작업자에 대한 생각,하지만 약간의 소리 멀리 가져 왔는데, 나는 그것이 일어날 수 있다고 생각하지 않았다. 어쨌든 당신의 회신과 코드에 감사드립니다! :) 나는 느린 작업자 문제에 대한 해결 방법을 찾으려고 노력할 것입니다. – Masiar