2010-02-14 13 views
8

Esiste un modo per condividere una variabile tra due web worker? (Lavoratori Web sono fondamentalmente thread in Javascript)Condivisione delle variabili tra i web worker? [variabili globali?]

In linguaggi come C# si ha:

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

So che questo è un cattivo esempio, ma nella mia applicazione Javascript, ho un filo di effettuare i calcoli pesanti che possono essere si sviluppa su più thread [poiché ho una grande quantità di dati sotto forma di array. Tutti gli elementi dell'array sono indipendenti l'uno dall'altro. In altre parole, i miei thread di lavoro non devono preoccuparsi di blocco o qualcosa di simile]

ho trovato l'unico modo per "condividere" una variabile tra due thread sarebbe quello di creare un getter/setter [via prototipazione] e quindi utilizzare postMessage/onmessage ... anche se questo sembra davvero inefficiente [specialmente con gli oggetti, che devo usare JSON per AFAIK]

LocalStorage/Database è stato eliminato dalle specifiche HTML5 perché potrebbe causare deadlock, quindi non è un'opzione [purtroppo] ...

L'altra possibilità che ho trovato è stata quella di utilizzare PHP per avere effettivamente una pagina getVariable.php e setVariable.php, che usano localstorage per memorizzare i nts/stringhe ... ancora una volta, gli oggetti [che include le matrici/null] devono essere convertiti in JSON ... e successivamente, JSON.parse() 'd.

Per quanto ne so, Javascript thread di lavoro sono totalmente isolati dal principale page thread [che è il motivo per cui Javascript thread di lavoro non possono accedere a elementi DOM

Anche se funziona postMessage, è lento.

Grazie!

risposta

8

I dipendenti Web sono deliberatamente condivisi-nulla - tutto in un lavoratore è completamente nascosto da altri lavoratori e dalle pagine del browser. Se ci fosse un modo per condividere valori non "atomici" tra i lavoratori, la semantica di quei valori sarebbe quasi impossibile da usare con risultati prevedibili. Ora, uno potrebbe introdurre i blocchi come un modo per utilizzare tali valori, in una certa misura - si acquisisce il blocco, esaminare e forse modificare il valore, quindi rilasciare il blocco - ma i blocchi sono molto difficili da usare e la solita modalità di errore è deadlock, si sarebbe in grado di "brick" il browser abbastanza facilmente. Questo non va bene per gli sviluppatori o gli utenti (in particolare se si considera che l'ambiente Web è così suscettibile di sperimentazione da parte di non programmatori che non hanno mai nemmeno sentito parlare di thread, blocchi o trasmissione di messaggi), quindi l'alternativa non è uno stato condiviso tra lavoratori o pagine nel browser. È possibile passare messaggi (che si possono considerare serializzati "over the wire" al lavoratore, che quindi crea la propria copia del valore originale in base alle informazioni serializzate) senza dover affrontare nessuno di questi problemi.

In realtà, il passaggio dei messaggi è il modo giusto per supportare il parallelismo senza lasciare che i problemi di concorrenza siano completamente fuori controllo. Orchestrate correttamente i vostri handoff di messaggi e dovreste avere tanta potenza quanto se poteste condividere lo stato. Davvero non vuoi l'alternativa che pensi di volere.

+0

Se ci fosse un modo per condividere i valori non "atomica" tra i lavoratori, la semantica di quei valori sarebbe impossibile da utilizzare con risultati prevedibili <-. Assolutamente sbagliato in ogni modo. – Tony

+0

Cura da elaborare? –

+0

Algoritmo di panificazione di Lamport. Dijkstra ha protetto la logica di comando. Tutto è specifico per la prevedibilità non deterministica. – Tony

5

No, ma è possibile inviare messaggi ai web worker che possono essere matrici, oggetti, numeri, stringhe, booleani e ImageData o qualsiasi combinazione di questi. Anche i web worker possono inviare messaggi.

2

Ci sono due opzioni per condividere i dati tra i lavoratori dedicati:

1. Shared Workers

L'interfaccia SharedWorker rappresenta uno specifico tipo di lavoratore che si può accedere da diversi contesti, come ad esempio la navigazione come diverse finestre , iframe o addirittura lavoratori.

Spawning a Shared Worker in a Dedicated Worker

2. Channel Messaging API

L'API Canale Messaging permette due script separati in esecuzione in diversi contesti di navigazione collegati allo stesso documento (ad esempio, due IFrame, o la documento principale e un IFrame, due documenti tramite un SharedWorker, o due lavoratori) per comunicare direttamente, passando il messaggio tra di loro attraverso canali a due vie (o tubi) con una porta a ciascuna estremità.

How to call shared worker from the web worker?

+0

I lavoratori condivisi sono lavoratori che possono essere collegati in una rete di messaggi, anziché il semplice albero di messaggistica di lavoratori dedicati. Tuttavia, il principio di base dei lavoratori è vero: non è possibile condividere nulla tra i lavoratori, ma solo i messaggi. – solendil

+1

Ma la compatibilità:/https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker#Browser_compatibility – Luckylooke