Parallelverarbeitung
Kalle_B
- php
Hallöle,
hat jemand Erfahrung mit Parallelverarbeitung mehrere PHP- Prozesse? Geht das überhaupt?
Für eine HTML- Tabelle mit 600 Zeilen dauert die Datenaufbereitung ca. 6 sec, die Sende- und Aufbereitungszeit des Browsers nochmal 6 sec. Und das nach mehreren Optimierungsschritten. Mit konvebntioonellen MItteln ist da wohl nichts mehr zu holen.
Wenn die 600 Treffer aus der Datenbank bekannt sind, setze ich pro Treffer nochmal zwei DB- Abfragen ab. (War vorher eine mit vielen JOINs). Das könnte eigentlich ein anderer PHP- Prozess machen.
Auch das Senden der Daten, z.B. in 50er- Blöcken könnte ein anderer Prozess übernehmen.
Habe im Moment aber keine Idee, wie die Synchronisierung aussiehen könnte. Wenn der Hauptprozess warten muss, habe ich wohl kaum etwas gewonnen.
Gestern schrieb mir Tom zu einem anderen Thema, dass der Hauptprozess etweder warten muss oder nie wieder was vom abgetrennten Sohnprozess hört:
https://forum.selfhtml.org/?t=179218&m=1182534
MfG Kalle
Hi,
ich hab da auch mal was gebastelt, find ich aber nicht mehr - da hab ich über mehrere Sockets mehrere HTTP Requests abgesetzt, die dann parallel laufen. Auch der Aufruf von php.exe (ja, ich nutze Windows) funktioniert auch.
Zwei phpclassed packages gibts, evtl. noch mehr, die evtl. auch über meinen verwendeten Ansatz oder ähnlich laufen, oder auch ganz anders, kenn sie nicht direkt.
http://www.phpclasses.org/browse/package/1136.html
http://www.phpclasses.org/browse/package/3953.html
Viel Erfolg!
Hi,
hab das Muster nach dem ich es damals gemacht hab wieder gefunden.
Einmal mit popen, und einmal mit sockets, siehe http://webforumz.com/php-forum/12595-multithreaded-php.htm
Nochmal viel Erfolg!
Einmal mit popen, und einmal mit sockets, siehe http://webforumz.com/php-forum/12595-multithreaded-php.htm
Danke für die schnelle Antwort. Werde mich da mal durchpfriemeln.
LG Kalle
Moin!
hat jemand Erfahrung mit Parallelverarbeitung mehrere PHP- Prozesse? Geht das überhaupt?
Für eine HTML- Tabelle mit 600 Zeilen dauert die Datenaufbereitung ca. 6 sec, die Sende- und Aufbereitungszeit des Browsers nochmal 6 sec. Und das nach mehreren Optimierungsschritten. Mit konvebntioonellen MItteln ist da wohl nichts mehr zu holen.
Wenn die 600 Treffer aus der Datenbank bekannt sind, setze ich pro Treffer nochmal zwei DB- Abfragen ab. (War vorher eine mit vielen JOINs). Das könnte eigentlich ein anderer PHP- Prozess machen.
Um mit den Abfragen was genau zu tun?
Multithreading bzw. parallele Verarbeitung ist dann unsinnig, wenn dadurch Ressourcen "doppelt" genutzt werden, die ohne parallele Verarbeitung die einzelne Aufgabe doppelt so schnell erledigen könnten, sprich: Wenn keine ungenutzten Ressourcen verfügbar sind, bringt Parallelverarbeitung keinen Geschwindigkeitsgewinn.
Ebenso bringt es nichts, wenn aufgrund der zu erledigenden Aufgabe nacheinander auf die Ergebnisse des vorherigen Arbeitsschritts gewartet werden muss.
Und zu guter Letzt: Wenn sowieso nur eine einzige Instanz der Datenbank vorhanden ist, die ihrerseits sicherlich schon hochoptimiert ist hinsichtlich paralleler Verarbeitung und Auslieferung von Ergebnissen, dann bringt es nichts, die Datenbank parallel an hundert Abfragen gleichzeitig arbeiten zu lassen, weil das genauso schnell abgearbeitet wird, wie hundert Abfragen nacheinander.
Im Gegenteil könnte durch Prepared Statements das serielle Abfragen gleichartiger Requests sogar deutlich schneller ablaufen.
Habe im Moment aber keine Idee, wie die Synchronisierung aussiehen könnte. Wenn der Hauptprozess warten muss, habe ich wohl kaum etwas gewonnen.
So ist es.
Und eigentlich sieht viel danach aus, dass der Hauptprozess warten muss. Denn wenn du am Ende eine komplette HTML-Seite ausgeben willst, die alle Ergebnisse der einzelnen Subprozesse enthält, bringt es dir gar nichts, wenn der einzige Server mit der einzigen Datenbank jetzt plötzlich wie wild parallel mit PHP arbeitet. Vermutlich bringt es dir sogar Nachteile, weil natürlich jeder einzelne PHP-Prozess seinen Anteil an RAM-Speicher benötigt, insgesamt also deutlich mehr RAM erforderlich sein könnte, als bei serieller Abarbeitung.
- Sven Rautenberg
Hello,
Und zu guter Letzt: Wenn sowieso nur eine einzige Instanz der Datenbank vorhanden ist, die ihrerseits sicherlich schon hochoptimiert ist hinsichtlich paralleler Verarbeitung und Auslieferung von Ergebnissen, dann bringt es nichts, die Datenbank parallel an hundert Abfragen gleichzeitig arbeiten zu lassen, weil das genauso schnell abgearbeitet wird, wie hundert Abfragen nacheinander.
Das sehe ich anders.
Wenn man mehrere Instanzen der Datenbank aufmacht, die jede diverse eigene Buffer für Read/Write, Indexes, Tabledescriptors etc benötigen, dann bringt man damit sein System ganz schnell zum stehen.
Besser ist es, den vorhandenen Instanzen optimale Verhältnisse zu schaffen.
Das meintest Du wahrscheinlich. Mir war es jetzt nur wichtig darauf hinzuweisen, dass z.B der primäre Speicherbedarf einer Instanz nicht relevant sinkt, nur weil man die Zahl der Anfragen halbiert.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg