2013-06-18 5 views
19

Im Allgemeinen wird JavaScript-Ausführung im Browser als single-threaded betrachtet. Gilt dieser einzelne Thread für alle Tabs, die in einem Browserfenster geöffnet sind?Teilen alle Registerkarten in einem Browserfenster einen einzelnen JavaScript-Thread?

Mit anderen Worten, wenn (anderer) JavaScript-Code in verschiedenen Registerkarten ausgeführt wird, werden alle mit einem einzigen Thread ausgeführt?

Was passiert außerdem, wenn mehrere Fenster desselben Browsers geöffnet sind und jedes Fenster mehrere Registerkarten enthält?

Abschließend hängt die Antwort auf die oben genannten von Browser-Hersteller/Version usw.?

+1

Ich denke, deine letzte Frage beantwortet alles. – HamZa

+1

Ich denke auch, dass Ihre Frage am besten für [Security SE] (http://security.stackexchange.com) geeignet ist. – HamZa

+0

@HamZa, abgesehen von Sicherheitsbedenken, hängt es mit der Leistung/Verhalten Ihres JS-Code, als ob es über Tabs single-threaded ist, dann kann etwas von Ihrem Code (z. B. setTimeout) verzögert werden, die unerwünschtes Verhalten verursachen könnte. – MLister

Antwort

8

Es gibt keine Möglichkeit, das generisch zu beantworten, da dies Browser-spezifisch ist.

So ziemlich jeder ältere Browser verwendet immer einen einzelnen Thread für jede Registerkarte, aber modernere Browser/Versionen könnten dies geändert haben (zum Beispiel hat chrome einen Thread pro Registerkarte - tatsächlich hat es sogar einen ganzen Prozess pro Registerkarte). BEARBEITEN: Korrektur vom Kommentar

Tatsächlich verwendet Chrome Process-per-Site-Instanz. Das bedeutet, dass eine einzelne Website in mehreren Tabs geöffnet wird noch durch den gleichen Prozess gemacht bekommen

Wenn Sie es aus Performance-Gründen fragen (wie eine Art zu fragen: „es ist in Ordnung, alles in meiner Website zu blockieren, indem eine ewige Endlosschleife, oder wird dies auf andere Registerkarten verteilt "), ist es sicherer anzunehmen, dass der Thread von allen geteilt wird. Wenn es in dem aktuellen Browser ist, dann hast du es geplant, und wenn es nicht ist, dann bekommst du eine bessere Leistung als geplant, kaum ein Problem.

Um einige Code in einem eigenen Thread laufen zu lassen, haben Sie eine Schleife bei Web Workers, aber sie sind immer noch weit davon entfernt, vollständig in jedem "modernen" Browser implementiert zu werden.

+0

danke für die Antwort. Also Chrome (alle Versionen?) Ist klar, was ist mit 'FF 11 +' und 'IE 9 +', 'Safari 5 +'? Sie werden allgemein als "moderne" Browser angesehen. – MLister

+4

Tatsächlich verwendet Chrome Process-per-Site-Instanz. Das bedeutet, dass eine einzelne Website, die auf mehreren Registerkarten geöffnet ist, immer noch vom selben Prozess gerendert wird. –

+0

@MLister: Es ist wirklich schwierig, die Frage richtig zu beantworten. Zum Beispiel hat IE 8 (ich weiß nicht, ob das mit weiteren Versionen geändert wurde) mehrere Prozesse gestartet (2 beim Start des Browsers und mehr bei Bedarf), aber die tatsächliche Anzahl der Prozesse stimmte nicht mit der Anzahl der Registerkarten überein. Sie könnten also zwei Tabs haben, die einen Prozess teilen, 4 teilen sich einen anderen ... – Lepidosteus

Verwandte Themen