Michael_K: Debugging Web Worker in Firefox

Beitrag lesen

Hallo Rolf,

vielen Dank für die Info. Es entspricht aber nicht meinem Verständnis der Specs. Es scheint ganz so, als dass Mozilla eine andere Interpretation der Specs hat. Ich habe nun noch einmal nachgelesen:

"A worker is said to be an active needed worker if any of its owners are either Document objects that are fully active or active needed workers.

A worker is said to be a protected worker if it is an active needed worker and either it has outstanding timers, database transactions, or network connections, or its list of the worker's ports is not empty, or its WorkerGlobalScope is actually a SharedWorkerGlobalScope object (i.e., the worker is a shared worker)."

Ich hatte damals auch irgendwo gelesen, dass ein Worker nicht geschlossen werden kann, wenn ein Listener active ist.

Was Du übrigens nicht zu tun brauchst, ist subworker.terminate(). Das ist nur nötig wenn Du Subworker abbrechen willst. Aber wenn Du die subWorkerFinished-Nachricht bekommst, ist er eh zu Ende.

Oh doch, das ist notwendig. Sonst bleiben die ganzen Web Worker offen. Man kann einen Worker von "innen" schliessen mit self.close() oder eben von "aussen" mit terminate(). Terminate ist aus meiner Erfahren sicherer bzw. einfacher. Wenn man den Worker nicht beendet, dann gibt es ein schönes memory leak, zumindest bei der V8 Engine (siehe in der Grafik rechts), die nach meinem Verständnis sich so verhält, wie es in den Specs steht. In meinem Beispielcode hätte ich den subWorker zum besseren Verständnis in eine separate Datei legen sollen, dann wird es noch transparenter, dass die sub Worker nicht geschlossen werden.

Bei FF scheint wirklich der GC zuzuschlagen, weil die Worker nicht mehr als actively needed angesehen werden.

Du müsstest den Subworker-Code übrigens in einen try/finally einschließen und die Ende-Message im finally-Teil senden, damit Du bei einem Error im Subworker immer noch eine Rückmeldung bekommen kannst.

Das Beispiel war stark abstrahiert. Im echten Code ist sichergestellt, dass der Worker wieder zurückfunkt, sei es bei einem Fehler oder wenn fertig.

Ich kann jetzt erst einmal weitermachen, werde aber von nun an einen Web Worker immer global binden und manuell steuern steuern. Werde deshalb künftig immer noch eine WorkerID erstellen, die dann via postMessage immer mit ausgetauscht wird.