2010-02-14 25 views
8

Có cách nào để tôi chia sẻ một biến giữa hai nhân viên web không? (Web workers về cơ bản chủ đề theo Javascript)Chia sẻ các biến giữa các nhân viên web? [global variables?]

Trong các ngôn ngữ như C# bạn có:

public static string message = ""; 
static void Main() 
{ 
message = "asdf"; 
new Thread(mythread).Run(); 
} 
public static void mythread() 
{ 
Console.WriteLine(message); //outputs "asdf" 
} 

Tôi biết thats một tấm gương xấu, nhưng trong ứng dụng Javascript của tôi, tôi có một sợi làm phép tính nặng có thể được trải rộng trên nhiều chủ đề [vì tôi có một đoạn dữ liệu lớn ở dạng mảng. Tất cả các phần tử của mảng đều độc lập với nhau. Nói cách khác, chủ đề công nhân của tôi không phải quan tâm đến việc khóa hay bất cứ thứ gì tương tự]

Tôi đã tìm thấy cách duy nhất để "chia sẻ" một biến giữa hai luồng là tạo Getter/setter [qua prototyping] và sau đó sử dụng postMessage/onmessage ... mặc dù điều này có vẻ không hiệu quả [đặc biệt là với các đối tượng, mà tôi phải sử dụng JSON cho AFAIK]

LocalStorage/Database đã được lấy ra khỏi đặc tả HTML5 vì nó có thể dẫn đến deadlocks, do đó, không phải là một lựa chọn [buồn bã] ...

Khả năng khác mà tôi đã tìm thấy là sử dụng PHP để thực sự có các trang getVariable.php và setVariable.php, sử dụng localstorage để lưu trữ i nts/strings ... một lần nữa, các đối tượng [bao gồm mảng/null] phải được chuyển đổi thành JSON ... và sau đó, JSON.parse() 'd.

Theo như tôi biết, Javascript đề người lao động được hoàn toàn tách ra từ trang chính chủ đề [đó là lý do javascript đề người lao động không thể truy cập phần tử DOM

Mặc dù postMessage hoạt động, đó là chậm.

Cảm ơn!

Trả lời

8

Nhân viên web được cố tình chia sẻ không có gì - mọi thứ trong công nhân hoàn toàn bị ẩn khỏi các công nhân khác và từ các trang trong trình duyệt. Nếu có bất kỳ cách nào để chia sẻ các giá trị không "nguyên tử" giữa các công nhân, thì ngữ nghĩa của các giá trị đó sẽ gần như không thể sử dụng với các kết quả dự đoán được. Bây giờ, một có thể giới thiệu khóa như một cách để sử dụng các giá trị đó, đến một mức độ nhất định - bạn có được khóa, kiểm tra và có thể sửa đổi giá trị, sau đó nhả khóa - nhưng khóa rất khó sử dụng và các chế độ thất bại thông thường là bế tắc, bạn sẽ có thể "gạch" trình duyệt khá dễ dàng. Điều đó không tốt cho các nhà phát triển hoặc người dùng (, đặc biệt là khi bạn xem xét môi trường web rất thích hợp để thử nghiệm bởi những người không lập trình chưa bao giờ nghe về chủ đề, khóa hoặc thông báo), vì vậy thay thế không có trạng thái được chia sẻ giữa các công nhân hoặc các trang trong trình duyệt. Bạn có thể truyền các thông điệp (mà người ta có thể nghĩ là được nối tiếp "qua dây" cho nhân viên, sau đó tạo bản sao riêng của giá trị ban đầu dựa trên thông tin được tuần tự hóa) mà không phải giải quyết bất kỳ vấn đề nào trong số này.

Thực sự, gửi tin nhắn là cách phù hợp để hỗ trợ song song mà không để cho các vấn đề tương tranh hoàn toàn mất kiểm soát. Dàn xếp thông điệp của bạn handoffs đúng và bạn nên có mỗi bit như nhiều quyền lực như thể bạn có thể chia sẻ nhà nước. Bạn thực sự không muốn thay thế bạn nghĩ rằng bạn muốn.

+0

Nếu có cách nào để chia sẻ các giá trị phi "nguyên tử" giữa người lao động, ngữ nghĩa của những giá trị đó sẽ không thể sử dụng với kết quả dự đoán <-. Hoàn toàn sai trong mọi phương diện. – Tony

+0

Chăm sóc để xây dựng? –

+0

Thuật toán hiệu bánh của Lamport. Dijkstra bảo vệ logic lệnh. Tất cả chỉ dành riêng cho khả năng dự đoán không xác định được. – Tony

5

Không, nhưng bạn có thể gửi thư cho người lao động web có thể là mảng, đối tượng, số, chuỗi, booleans và ImageData hoặc bất kỳ kết hợp nào trong số này. Nhân viên web cũng có thể gửi tin nhắn.

2

Có hai tùy chọn để chia sẻ dữ liệu giữa người lao động cống hiến:

1. Shared Workers

Giao diện SharedWorker đại diện cho một loại cụ thể của người lao động mà có thể được truy cập từ một số trường hợp trình duyệt, chẳng hạn như một số cửa sổ, iframe hoặc thậm chí là công nhân.

Spawning a Shared Worker in a Dedicated Worker

2. Channel Messaging API

Kênh Tin nhắn API cho phép hai kịch bản riêng biệt chạy trong bối cảnh duyệt khác nhau gắn liền với cùng một tài liệu (ví dụ, hai IFrame, hoặc tài liệu chính và khung nội tuyến, hai tài liệu qua SharedWorker hoặc hai công nhân) để liên lạc trực tiếp, qua messag es giữa nhau thông qua các kênh hai chiều (hoặc ống) với một cổng ở mỗi đầu.

How to call shared worker from the web worker?

+0

Công nhân được chia sẻ là những công nhân có thể được liên kết trong một mạng lưới các tin nhắn, thay vì cây thông điệp đơn giản của những người lao động chuyên dụng. Tuy nhiên nguyên tắc cơ bản của người lao động là đúng: bạn không thể chia sẻ bất cứ thứ gì giữa người lao động, chỉ truyền thông điệp. – solendil

+1

Nhưng khả năng tương thích:/https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker#Browser_compatibility – Luckylooke

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