Domanda

I Web worker condivisi sono progettati per consentire più pagine dalo stesso sito (origine) per condividere un singolo Web Worker.

Tuttavia, dalle specifiche (o da altri tutorial e informazioni sui lavoratori condivisi) non è chiaro se il ruolo di lavoro condiviso persisterà se si dispone di una sola finestra / scheda dal sito e si passa a un'altra pagina dello stesso sito.

Ciò sarebbe molto utile nel caso di una connessione WebSocket da Shared Worker che rimane connessa durante la navigazione del sito.Ad esempio, immagina un ticker di borsa o un'area chat che persisterebbe (senza dover ricollegare il WebSocket) anche durante la navigazione del sito.

È stato utile?

Soluzione

Ho eseguito alcuni test per trovare in pratica la risposta a questa domanda.

Firefox non supporta ancora la creazione di connessioni WebSocket da Web Workers: https:// bugzilla. mozilla.org/show_bug.cgi?id=504553 Quindi Firefox non è rilevante finché il bug non viene risolto.

IE 10 non ha il supporto per Shared Web Workers , quindi non è nemmeno rilevante. Quindi resta Chrome.

Ecco un esempio per testare i web worker condivisi.

Prima l'HTML:

<!DOCTYPE html>
<html>
<body>
    <a href="shared.html">reload page</a>
    <script>
        var worker = new SharedWorker("shared.js");
        worker.port.addEventListener("message", function(e) {
            console.log("Got message: " + e.data);
        }, false);
        worker.port.start();
        worker.port.postMessage("start");
    </script>
</body>
</html>

Quindi l'implementazione del lavoro condiviso stesso in shared.js:

var connections = 0;

self.addEventListener("connect", function(e) {
    var port = e.ports[0];
    connections ++;
    port.addEventListener("message", function(e) {
        if (e.data === "start") {
            var ws = new WebSocket("ws://localhost:6080");
            port.postMessage("started connection: " + connections);
        }
    }, false);
    port.start();
}, false);

Risultati dei test in Chrome 20 ( la risposta ):

Quando la pagina viene caricata simultaneamente in due schede separate, il conteggio delle connessioni aumenta ogni volta che una delle pagine viene ricaricata o si fa clic sul collegamento autoreferenziale.

Se viene caricata solo una singola istanza della pagina, il conteggio delle connessioni non cambia mai quando la pagina viene ricaricata o si fa clic sul collegamento.

Quindi, in Chrome 20: I web worker condivisi non persistono durante i ricaricamenti delle pagine e i clic di navigazione dei link .

Altri suggerimenti

Sembra che questo sia fondamentalmente lo stesso problema di la domanda" Cosa succede a un thread di lavoro Web HTML5 quando la scheda viene chiusa mentre è in esecuzione? ". Penso che la parte fondamentale della specifica sia questa dichiarazione :

Gli interpreti possono invocare il modello di elaborazione "kill a worker" su un file lavoratore in qualsiasi momento, ad es. in risposta alle richieste degli utenti, in risposta a Gestione delle quote della CPU o quando un lavoratore smette di essere un attivo necessario lavoratore se il lavoratore continua l'esecuzione anche dopo il flag di chiusura era impostato su true.

Un ' attivo lavoratore necessario "è definito come segue:

Si dice che un lavoratore sia un lavoratore necessario attivo se uno qualsiasi del documento gli oggetti nei documenti del lavoratore sono completamente attivi.

Quindi, a quanto ho capito, se tutte le finestre che fanno riferimento a un worker vengono chiuse, la specifica richiede il browser per terminare il worker, ma non immediatamente. A seconda di ciò, la persistenza sarà quindi inaffidabile anche se sembra funzionare occasionalmente.

Nel tuo esempio, il mio approccio sarebbe caricare l'intero sito con Ajax: non sarai in grado di eseguire i Web Worker se i tuoi utenti hanno comunque JS disabilitato, quindi usa API Cronologia per far corrispondere l'indirizzo della pagina dell'utente a la pagina effettiva (mantenendo il motore di ricerca e la compatibilità non JS).

Ho avuto successo con una tecnica piuttosto indiretta in base alla quale quando voglio andare alla pagina successiva ma mantengo SharedWorker, apro una finestra popup (si spera non invadente) che crea lo stesso worker, aspetto che diventi attivo einvia un messaggio alla porta / finestra originale, che poi passa alla nuova pagina e poi, quando quella pagina viene caricata, chiude il popup.Questa strategia mantiene sempre almeno una connessione attiva, quindi il lavoratore non decide mai di spegnersi.

Questa tecnica sembra essere abbastanza robusta finora.Sebbene vedere il popup sia alquanto fastidioso, è un ragionevole compromesso per alcuni casi d'uso.

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