Hãy xem xét đoạn mã sau và giải thích từ này Mozilla hướng dẫn "Using web workers":Điều kiện chủng tộc với nhân viên web khi thiết lập xử lý onmessage?
var myWorker = new Worker('my_worker.js');
myWorker.onmessage = function(event) {
print("Called back by the worker!\n");
};
Line 1 trong ví dụ này tạo và bắt đầu chạy các sợi nhân. Dòng 2 đặt trình xử lý onmessage cho nhân viên đến một hàm được gọi khi nhân viên gọi hàm postMessage() của riêng mình.
Chủ đề được bắt đầu tại thời điểm xây dựng Công nhân. Tôi tự hỏi liệu có thể có một điều kiện chủng tộc khi đặt trình xử lý onmessage không. Ví dụ: nếu nhân viên web đăng thông báo trước onmessage được đặt.
Có ai đó biết thêm về điều này không?
Cập nhật:
Andrey chỉ ra rằng người lao động web nên bắt đầu công việc của mình, khi nó nhận được một tin nhắn, như trong ví dụ Fibonacci trong hướng dẫn Mozilla. Nhưng điều đó không tạo ra một điều kiện chủng tộc mới về việc thiết lập trình xử lý onmessage trong nhân viên web?
Ví dụ:
Kịch bản chính:
var myWorker = new Worker('worker.js');
myWorker.onmessage = function(evt) {..};
myWorker.postMessage('start');
Các kịch bản lao động web ('worker.js')
var result = [];
onmessage = function(evt) {..};
Và sau đó xem xét con đường thực hiện như sau:
main thread web worker
var worker = new Worker("worker.js");
var result = [];
myWorker.onmessage = ..
myWorker.postMessage('start');
onmessage = ..
Th e "var result = []" dòng có thể bị bỏ qua, nó vẫn sẽ có hiệu lực tương tự.
Và đây là đường dẫn thực thi hợp lệ, tôi đã dùng thử bằng cách đặt thời gian chờ trong nhân viên web! Tại thời điểm này tôi không thể nhìn thấy, làm thế nào để sử dụng công nhân web mà không chạy vào điều kiện chủng tộc ?!
Liên kết đến danh sách gửi thư hiện đã bị hỏng. Bất kỳ ý tưởng nơi để đọc các chủ đề, hoặc luân phiên, đã có bất kỳ gotchas? – HRJ
@HRJ Xin lỗi, tôi không thể tìm thấy phiên bản đã lưu trữ của chuỗi. Nhưng không có gotchas, một hàng đợi tin nhắn đảm bảo rằng bạn không phải lo lắng về điều kiện chủng tộc. – tsauerwein