Tôi có một Web Worker. Tôi muốn thực hiện các yêu cầu mạng định kỳ với nó. Một điều tôi đặc biệt muốn là thực hiện các yêu cầu này ngay cả khi chuỗi thực hiện JS chính bị chặn (ví dụ: bởi window.alert). Tôi đang sử dụng Chrome 38.Công nhân web bị chặn bởi chuỗi chính trong Chrome
Tuy nhiên, khi tôi cố thực hiện yêu cầu mạng trong công nhân, các yêu cầu có vẻ bị chặn bởi chuỗi giao diện người dùng. Dưới đây là một ví dụ giả tạo để minh họa cho vấn đề:
base.js:
var worker = new Worker("/worker.js");
setTimeout(function() {
console.log("begin blocking");
var startDt = new Date();
var blockPeriod = 5000;
var a;
// Obviously we'd never actually do this, but this while loop
// is a convenient way to create the problem case (a blocked main
// thread).
while ((new Date() - startDt) < blockPeriod) {
a = 0;
}
console.log("stop blocking");
}, 3000);
worker.js:
var requestInterval = 1000;
var sendRequest = function() {
console.log("Send request interval");
var request = new XMLHttpRequest();
request.open("GET", "/ping", true);
request.onload = function() {
if (request.status === 200){
console.log(request.responseText)
} else {
console.log(request.status)
}
};
request.onerror = function() {
console.log("error")
};
request.send();
setTimeout(sendRequest, requestInterval);
}
sendRequest();
Kết quả tôi nhìn thấy được mà chúng ta thấy các yêu cầu HTTP thành công cho ba giây, cho đến khi chặn bắt đầu. Tại thời điểm này, chúng ta không thấy bất cứ điều gì đăng nhập vào giao diện điều khiển cho đến khi kết thúc chặn, lúc này chúng ta thấy năm "Gửi khoảng yêu cầu" s theo sau là 5 bản ghi của phản ứng, như vậy:
Send request interval
{"pong": true}
Send request interval
{"pong": true}
Send request interval
{"pong": true}
Send request interval
{"pong": true}
begin blocking
stop blocking
5x Send request interval
5x {"pong": true}
Send request interval
{"pong": true}
tôi cũng thấy trong nhật ký máy chủ của tôi mà không có yêu cầu nào được thực hiện trong thời gian chặn đó, thì năm yêu cầu đó đều được nhận gần như đồng thời vào cuối thời gian chặn.
Cho rằng "Gửi khoảng thời gian yêu cầu" xảy ra năm lần liên tiếp, công nhân rõ ràng là tiếp tục thực hiện: nếu không, nó sẽ không làm cho nó thông qua để xếp hàng lặp tiếp theo. Tôi cũng thấy rằng nếu tôi chặn bằng cách kích hoạt window.alert thay vì quay trong vòng lặp, tôi nhận được thông báo tường trình từ đầu sendRequest
trong khoảng thời gian 1 giây và sau đó nhận thông báo nhật ký trình xử lý phản hồi trong một loạt lớn ngay khi tôi ngừng chặn.
Trong Firefox, chuỗi nền dường như dừng hoàn toàn trong trường hợp này (Tôi không nhận được cùng một loạt năm yêu cầu được xếp hàng trong khoảng thời gian bị chặn). Tuy nhiên, tôi chỉ nhắm mục tiêu Chrome trong trường hợp này (và cuối cùng tôi muốn sử dụng WebSockets mà thậm chí không hoạt động trong Firefox Workers), vì vậy tôi không thực sự quan tâm đến điều đó.
Tất cả được cộng lại với nhau, điều này khiến tôi tin rằng có một số lớp hoạt động trong Web Workers bị chặn bởi luồng sinh sản, và một số không (tôi đã thấy hành vi tương tự này với WebSockets). Cụ thể, tôi muốn biết (nếu có ai biết):
- Hoạt động nào của công nhân bị chặn bởi chủ đề chính trong Chrome?
- Có cách nào để giải quyết vấn đề này không? Tôi rất muốn có thể thiết lập một kết nối WebSocket trong một Worker, và sau đó tiếp tục PING/PONG qua lại, ngay cả khi một cái gì đó (chẳng hạn như một cảnh báo/xác nhận) không chặn thread chính.
- Điều này có vô nghĩa không, và tôi có đang làm điều gì đó ngu ngốc không?
Vâng, nó [có vẻ như vòng lặp sự kiện không dừng] (http://stackoverflow.com/a/2734311/1048572) trong một 'alert' :-) – Bergi
Bergi, cảm ơn bạn đã trả lời. Tuy nhiên, toàn bộ ý tưởng của công nhân web là họ hoạt động trong một chủ đề nền và không can thiệp vào giao diện người dùng (bobince thậm chí đề cập đến cảnh báo này trong câu trả lời bạn đã liên kết). Và đó rõ ràng là trường hợp ở một mức độ nào đó: các ví dụ tôi đã phác thảo ở trên cho thấy rằng ở một mức độ nào đó, chúng được thực hiện ngay cả khi chủ đề chính bị chặn. Câu hỏi lớn của tôi là nơi dòng nằm giữa cái gì và không bị chặn bởi chủ đề chính. – heliotrope
"Không chặn không nhất thiết có nghĩa là đồng thời". Bài viết nguồn: http://code.tutsplus.com/tutorials/getting-started-with-web-workers--net-27667 – sergolius