Domanda

C'è un modo per me di condividere una variabile tra i due lavoratori web? (Lavoratori Web sono fondamentalmente thread in Javascript)

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 distribuite su più thread [dal momento che ho una grossa fetta dei dati sotto forma di un array. Tutti gli elementi della matrice 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 [in particolare con gli oggetti, che devo usare JSON per quanto ne so]

LocalStorage / Database è stato preso fuori della specifica HTML5 perché potrebbe portare a situazioni di stallo, in modo che non è un'opzione [purtroppo] ...

L'altra possibilità che ho trovato è stato quello di utilizzare PHP di avere in realtà un getVariable.php e setVariable.php pagine, che utilizzano localStorage per memorizzare ints / stringhe ... Ancora una volta, gli oggetti [che comprende gli assiemi / null] deve essere convertito in JSON ... e poi, JSON.parse () 'd.

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

Anche se funziona postMessage, è lento.

È stato utile?

Soluzione

lavoratori Web sono volutamente condivisi-niente - tutto in un lavoratore è completamente nascosto da altri lavoratori e dalle pagine nel browser. Se ci fosse un modo per condividere i valori non "atomica" tra i lavoratori, la semantica di quei valori sarebbe quasi impossibile da usare con risultati prevedibili. Ora, una potrebbe introdurre serrature come un modo per utilizzare tali valori, in una certa misura - si acquista il blocco, esaminare e forse modificare il valore, quindi rilasciare il blocco - ma serrature sono molto difficili da usare, e dal momento che la modalità di guasto abituale è stallo si sarebbe in grado di "mattone" del browser piuttosto facilmente. Che non è buona per gli sviluppatori o utenti ( specialmente se si considera che l'ambiente web è così suscettibile di sperimentazione da parte non programmatori che non hanno mai nemmeno sentito parlare di discussioni, serrature, o un messaggio-passing), in modo da l'alternativa non è stato condiviso tra i lavoratori o le pagine nel browser. È possibile passare i messaggi (che si può pensare come essere serializzato "sul filo" per il lavoratore, che poi crea la propria copia del valore originale sulla base delle informazioni serializzato) senza dover affrontare uno di questi problemi.

In realtà, il messaggio-passing è il modo giusto per sostenere il parallelismo senza lasciare che i problemi di concorrenza ottenere completamente fuori controllo. Orchestrare i tuoi messaggi handoff correttamente e si dovrebbe avere ogni punta tanto potere come se si potesse condividere lo stato. Davvero non si desidera che l'alternativa si pensa che si desidera.

Altri suggerimenti

No, ma è possibile inviare messaggi ai lavoratori web che possono essere array, oggetti, numeri, stringhe, booleani e ImageData o qualsiasi combinazione di questi. lavoratori Web possono inviare messaggi troppo indietro.

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

1. lavoratori condivise

  

L'interfaccia SharedWorker rappresenta uno specifico tipo di lavoratore che   si può accedere da diversi contesti di navigazione, come molti   finestre, iframe o anche i lavoratori.

Deposizione di un operaio condivisa in un operaio dedicato

2. Canale Messaging API

  

L'API Canale Messaging permette due script separati in esecuzione in   diversi contesti navigazione attaccati allo stesso documento (ad esempio, due   IFrame o il documento principale e un IFrame, due documenti tramite un   SharedWorker, o due operatori) di comunicare direttamente, passando   messaggi tra uno all'altro attraverso canali bidirezionali (o tubi) con   una porta a ciascuna estremità.

Come chiamare lavoratore condiviso da parte del lavoratore web?

Di recente ho letto su (ma non l'ho usato), condiviso lavoratori . Secondo condividere il lavoro! Opera viene fornito con supporto SharedWorker , il supporto è solo nei nuovi browser (Opera 10.6, Chrome 5, Safari 5).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top