Verhindern, dass HTML5-Web-Worker gesperrt werden und somit korrekt auf Nachrichten von Parent antworten

8

Ich verwende Web-Worker, um eine CPU-intensive Arbeit zu erledigen, habe aber die Anforderung, dass der Worker auf Nachrichten vom übergeordneten Skript reagiert, während der Worker noch verarbeitet.

Der Worker reagiert jedoch nicht auf Nachrichten, während er in einer Verarbeitungsschleife gesperrt ist, und ich habe keine Möglichkeit gefunden, die Nachrichtenwarteschlange abzufragen. Daher scheint es, als ob die einzige Lösung darin besteht, die Verarbeitung in einem Intervall zu unterbrechen, damit alle Nachrichten in der Warteschlange bedient werden können.

Die offensichtlichen Optionen sind, einen Timer zu verwenden (sagen wir mit setInterval), aber ich habe gelesen, dass die minimale Verzögerung zwischen den Auslösungen ziemlich lang ist ( Ссылка ) was unglücklich ist, da es die Verarbeitung sehr verlangsamen wird.

Was denken andere Leute darüber? Ich werde versuchen, dass der Mitarbeiter onmessage an sich selbst am Ende jedes onmessage absetzt, also effektiv einen Schritt der Verarbeitungsschleife pro von ihm empfangenem Ereignis implementiert, aber nur sehen wollte, ob irgendjemand irgendwelche Ideen dazu hatte das.

Danke,

    
Stephen Ierodiaconou 05.07.2010, 07:31
quelle

3 Antworten

6

Ein Arbeiter kann Unterarbeiter hervorbringen. Sie können festlegen, dass Ihr Hauptarbeiter als Nachrichtenwarteschlange fungiert, und wenn eine Anforderung für eine lange Ausführung eingeht, erstellen Sie einen Unterarbeiter, um diese Daten zu verarbeiten. Der Sub-Worker kann dann die Ergebnisse an den Haupt-Worker zurücksenden, um das Ereignis aus der Warteschlange zu entfernen und die Ergebnisse an den Haupt-Thread zurückzugeben. Auf diese Weise wird es Ihrem Hauptmitarbeiter immer möglich sein, auf neue Nachrichten zu warten, und Sie haben die vollständige Kontrolle über die Warteschlange.

- Nick

    
nciagra 05.07.2010 15:02
quelle
3

Ich bin selbst auf dieses Thema gestoßen, als ich zum ersten Mal mit Arbeitern gespielt habe. Ich habe auch mit setInterval debattiert, aber ich hatte das Gefühl, dass dies ein ziemlich hacky Ansatz für das Problem sein würde (und ich war diesen Weg bereits für mein emuliertes Multithreading gegangen). Stattdessen entschied ich mich dafür, die Worker aus dem Hauptthread (worker.terminate ()) zu beenden und sie neu zu erstellen, wenn die Aufgabe, an der sie beteiligt sind, unterbrochen werden muss. Müllsammlung usw. schien in meinen Tests behandelt zu werden.

Wenn Daten von diesen Aufgaben, die Sie speichern möchten, vorhanden sind, können Sie sie in regelmäßigen Abständen immer wieder zum Hauptthread zurückspeichern, und wenn Sie eine Logik implementieren möchten, ob sie beendet wird oder nicht, Sie können die relevanten Daten in regelmäßigen Abständen zurückgeben, um dies zu ermöglichen.

Das Hervorbringen von Subworkern würde sowieso zu den gleichen Problemen führen; Sie müssten die Sub-Worker immer noch nach einer gewissen Logik beenden (oder neue erstellen), und ich bin mir nicht sicher, ob sie so gut unterstützt wird (zum Beispiel bei chrome).

James

    
jsdw 19.05.2012 10:02
quelle
0

Mit dem gleichen Problem habe ich den Web Worker Draft durchsucht und etwas im Verarbeitungsmodell gefunden , Schritte von 9 bis 12. Soweit ich verstanden habe, wird ein Arbeiter, der mit der Bearbeitung einer Aufgabe beginnt, erst dann eine weitere Aufgabe bearbeiten, wenn die erste abgeschlossen ist. Wenn Sie also eine Aufgabe nicht stoppen und fortsetzen möchten, sollte ncigras Antwort bessere Ergebnisse liefern als eine Neuplanung jeder Iteration der Aufgabe.

Aber trotzdem nachforschen.

    
Giacomo 02.10.2010 00:25
quelle

Tags und Links