2010-07-05 19 views
8

Tôi đang sử dụng công nhân web để thực hiện một số công việc chuyên sâu về CPU nhưng có yêu cầu nhân viên sẽ trả lời thư từ tập lệnh gốc trong khi người lao động vẫn đang xử lý.Cách ngăn chặn các công nhân Web HTML5 bị khóa do đó trả lời đúng các thư từ cha mẹ

Tuy nhiên, nhân viên sẽ không trả lời tin nhắn trong khi nó bị khóa trong vòng xử lý và tôi không tìm thấy cách nào để nói bình chọn hàng đợi tin nhắn. Vì vậy, nó có vẻ như giải pháp duy nhất là để phá vỡ chế biến tại một khoảng thời gian để cho phép bất kỳ tin nhắn trong hàng đợi được phục vụ.

Các tùy chọn hiển nhiên là sử dụng bộ đếm thời gian (nói với setInterval) tuy nhiên tôi đã đọc rằng độ trễ tối thiểu giữa các lần đốt khá dài (http://ajaxian.com/archives/settimeout-delay), điều này thật không may vì nó sẽ làm chậm quá trình xử lý.

Suy nghĩ của người khác về điều này là gì? Tôi sẽ cố gắng tự động gửi công văn onmessage vào cuối mỗi onmessage, do đó thực hiện hiệu quả một bước của vòng lặp xử lý cho mỗi sự kiện nhận được từ chính nó, nhưng chỉ muốn xem liệu có ai có ý tưởng về điều này hay không.

Xin cảm ơn,

+0

Hooking https://stackoverflow.com/a/32269593/632951 – Pacerier

Trả lời

6

Nhân viên có thể đẻ trứng công nhân phụ. Bạn có thể yêu cầu nhân viên chính của bạn hoạt động như hàng đợi tin nhắn của bạn và khi nó nhận được yêu cầu cho một hoạt động dài chạy, sinh ra một nhân viên phụ để xử lý dữ liệu đó. Sau đó, nhân viên phụ có thể gửi kết quả cho nhân viên chính để xóa sự kiện khỏi hàng đợi và trả về kết quả cho luồng chính. Bằng cách đó, nhân viên chính của bạn sẽ luôn được tự do lắng nghe các tin nhắn mới và bạn có toàn quyền kiểm soát hàng đợi.

--Nick

+1

Tôi nghĩ rằng điều này sẽ không hoạt động nếu việc tính toán phải được dừng lại và tiếp tục. Tôi chưa tìm được giải pháp cho việc này. Ví dụ: http: //gist.github.com/607058 – Giacomo

+0

@nciagra, Câu trả lời này không hiệu quả: bạn chỉ đơn giản là đẩy vấn đề lên một bước. Vì vậy, nếu bạn đẻ trứng công nhân phụ? Bây giờ, những người làm việc phụ bận rộn thực hiện tính toán và bạn không thể ngắt chúng khỏi công việc chính của bạn. Tôi đoán [giải pháp khoảng thời gian cũ] (https://stackoverflow.com/a/10180450/632951) (bây giờ trong trang web chính nó) là cách duy nhất nếu chúng ta cần phải làm gián đoạn công nhân, webworkers nghiêm túc cần cơ chế ngắt thực sự như những gì Java có thể làm. – Pacerier

0

Có cùng một vấn đề tôi đã tìm kiếm những người lao động web soạn thảo và tìm thấy một cái gì đó trong phần Processing model, bước từ 9 đến 12. Theo như tôi hiểu, một nhân viên bắt đầu xử lý một nhiệm vụ sẽ không xử lý một cái khác cho đến khi cái đầu tiên được hoàn thành. Vì vậy, nếu bạn không quan tâm đến việc dừng lại và tiếp tục một nhiệm vụ, câu trả lời của nciagra sẽ cho hiệu suất tốt hơn so với việc lên lịch lại mỗi lần lặp lại nhiệm vụ.

Vẫn đang điều tra.

+0

Câu trả lời của nciagra không hoạt động. – Pacerier

3

Lần đầu tiên tôi gặp sự cố này khi chơi với công nhân. Tôi cũng tranh luận bằng cách sử dụng setInterval, nhưng tôi cảm thấy rằng đây sẽ là một cách tiếp cận khá hacky cho vấn đề (và tôi đã đi theo cách này cho đa luồng mô phỏng của tôi). Thay vào đó, tôi quyết định chấm dứt các công nhân từ luồng chính (worker.terminate()) và tạo lại chúng nếu nhiệm vụ mà chúng liên quan đến cần phải bị gián đoạn. Thu gom rác vv dường như được xử lý trong thử nghiệm của tôi.

Nếu có dữ liệu từ các tác vụ bạn muốn lưu, bạn luôn có thể đăng lại chủ đề chính để lưu trữ theo chu kỳ và nếu có một số logic bạn muốn triển khai liên quan đến việc chúng có bị chấm dứt hay không , bạn có thể đăng dữ liệu có liên quan trở lại theo khoảng thời gian đủ đều đặn để cho phép.

Các công việc con đẻ trứng sẽ dẫn đến cùng một tập hợp các vấn đề; bạn vẫn sẽ phải chấm dứt các subworkers (hoặc tạo ra những cái mới) theo một số logic, và tôi không chắc chắn nó cũng được hỗ trợ (trên chrome ví dụ).

James

+1

có cùng một vấn đề và sử dụng cùng một giải pháp. Không để mất các tính toán được thực hiện bởi các webworker tôi đăng dữ liệu tính toán tại một số khoảng thời gian để cha mẹ "cửa sổ", và sau đó khi respawning webworker tôi bắt đầu với kết quả tính toán cho đến nay – Picard

+0

Thật không may, worker.terminate() rò rỉ bộ nhớ. .. nó có thể hoạt động nếu được sử dụng không thường xuyên, nhưng trong trường hợp cụ thể của tôi nó treo trình duyệt rất nhanh https://bugs.chromium.org/p/chromium/issues/detail?id=502298 – solendil

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