2015-03-24 5 views
5

Ich habe ein Problem mit PhantomJS mit Web-Server-Modul in einer Multi-Thread-Art, mit gleichzeitiger Anfragen.
Ich benutze PhantomJS 2.0, um Highstock-Graphen auf der Serverseite mit Java zu erstellen, wie erklärt here (und den Code here). Es funktioniert gut, und beim Testen von Graphen verschiedener Größen, habe ich Ergebnisse, die ziemlich konsistent sind, etwa 0,4 Sekunden, um ein Diagramm zu erstellen.PhantomJS mit integriertem Webserver verwendet nur eine CPU

Der Code, mit dem ich verlinkt habe, wurde ursprünglich vom Highcharts-Team veröffentlicht und wird auch in ihrem Exportserver unter http://export.highcharts.com/ verwendet. Um gleichzeitige Anfragen zu unterstützen, führt es einen Pool von erzeugten PhantomJS-Prozessen, und im Prinzip ist sein Modell eine phantomjs-Instanz pro gleichzeitige Anfrage.

Ich habe gesehen, dass das Webserver-Modul bis zu 10 gleichzeitige Anfragen unterstützt (hier erklärt), also dachte ich, ich könnte darauf tippen, um eine geringere Anzahl von PhantomJS-Prozessen in meinem Pool zu halten. Als ich jedoch versuchte, mehr Threads zu verwenden, erlebte ich eine lineare Verlangsamung, als ob PhantomJS nur eine CPU verwendete. Diese Verlangsamung wird wie folgt angezeigt (für eine einzelne PhantomJS-Instanz):

1 Client-Thread, durchschnittliche Anforderungszeit 0,44 Sekunden.
2 Client-Threads, durchschnittliche Anfragezeit 0,76 Sekunden.
4 Client-Threads, durchschnittliche Anfragezeit 1,5 Sekunden.

Ist dies eine bekannte Einschränkung von PhantomJS? Gibt es einen Weg dahin?

(Frage gepostet auch here)

+0

Sie haben einige * hier * Links vergessen. –

+0

Die interessantere Frage könnte sein, warum sich die Zeit nicht verdoppelte, indem man von 1 zu 2 Clients ging und warum sie sich verdoppelte, indem sie von 2 zu 4 Clients ging. –

+0

Es hat sich fast verdoppelt, ich denke, Sie können es auf die Fehlermarge in den Messungen zurückführen. – Yoni

Antwort

5

Ist das eine bekannte Einschränkung von PhantomJS?

Ja, es eine erwartete Einschränkung ist, weil PhantomJS den gleichen WebKit-Engine für alles verwendet und da JavaScript Single-Threaded ist, bedeutet dies effektiv, dass jede Anforderung eines nach dem anderen (möglicherweise verriegelt) behandelt werden, aber niemals gleichzeitig. Die durchschnittliche Gesamtzeit erhöht sich linear mit jedem Kunden.

Die documentation sagt:

Derzeit gibt es eine Grenze von 10 gleichzeitigen Anforderungen; Alle anderen Anfragen werden in die Warteschlange gestellt.

Es besteht ein Unterschied zwischen den Begriffen gleichzeitige und parallele Anfragen. Concurrent bedeutet einfach, dass die Aufgaben nicht deterministisch beendet werden. Es bedeutet nicht, dass die Anweisungen, aus denen die Aufgaben bestehen, parallel auf verschiedenen (virtuellen) Kernen ausgeführt werden.

Gibt es einen Weg um es herum?

Anders als Ihre Server-Tasks durch child_process läuft, kein. Die Art und Weise, wie JavaScript Multi-Threading unterstützt, geschieht mithilfe von Web Workers, aber ein Worker ist Sandboxed und hat keinen Zugriff auf require und kann daher keine Seiten erstellen, um solche Aufgaben zu erledigen.

+1

Was ist mit Web-Mitarbeitern für Multi-Thread-JS? – lintmouse

+0

Web-Worker ermöglichen eine Multithread-Ausführung, aber ich weiß nicht, ob sie für gleichzeitige Anfragen verwendet werden können. Dies ist eine interessante Idee. –

+0

Ich habe es gerade mit einem WebWorker probiert, aber leider gibt es keine 'require' im Worker, also gibt es keine Möglichkeit, die Verarbeitung parallel zu machen. –

Verwandte Themen