2010-07-09 33 views
5

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 ?!

Trả lời

3

Câu trả lời là cả tập lệnh chính và nhân viên web đều có hàng đợi MessagePort thu thập thư trước khi tập lệnh ban đầu của công nhân trả lại.

Để biết chi tiết, xem chủ đề này vào danh sách gửi thư giúp đỡ WHATWG: http://lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

+0

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

+0

@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

2

Có, có thể gây ra tình trạng đua ở đây. Trách nhiệm nằm trên nhà phát triển của Worker. Nó sẽ bắt đầu đăng tin nhắn chỉ sau khi nhận được tin nhắn qua postMessage(). Trong hàm tạo, nó chỉ phải khởi tạo, nhưng không thực sự xử lý. Trong phần Ví dụ từ trang của bạn, có mẫu tốt về số fibonachi. Nhìn vào cấu trúc của nó, công việc thực sự bắt đầu khi nhận được tin nhắn. Thực hiện theo mô hình đó.

+2

gì nếu các chủ đề chính sẽ gửi thông điệp khởi đầu của nó, trước khi người lao động web đã thiết lập xử lý onmessage của nó? Điều đó có thể không? – tsauerwein

Các vấn đề liên quan