Wie Sie entscheiden, ob Sie in Ihrer Anwendung Threads verwenden oder einen separaten Prozess erstellen sollen, um Parallelität zu erreichen.
Antworten
Zu viele Anzeigen?Threads sind leichter, und für die Erstellung mehrerer "Worker", um alle verfügbaren CPUs oder Kerne zu nutzen, ist man mit Threads besser bedient.
Wenn die Arbeiter besser isoliert und robuster sein sollen, wie bei den meisten Servern, sollten Sie Sockets verwenden. Wenn ein Thread abstürzt, ist normalerweise der gesamte Prozess betroffen, einschließlich anderer Threads, die in diesem Prozess arbeiten. Wenn ein Prozess abstürzt, hat das keine Auswirkungen auf andere Prozesse, so dass diese fröhlich weiterarbeiten können, als wäre nichts passiert.
Prozesse haben mehr isolierten Speicher. Dies ist aus einer Reihe von Gründen wichtig:
- Es ist schwieriger für eine einzelne Aufgabe, die anderen Aufgaben zum Absturz zu bringen.
- Pro Prozess wird mehr Speicherplatz zur Verfügung stehen. Dies ist wichtig für große, leistungsstarke Anwendungen wie Apache oder Datenbankserver wie Postgres. Dies ist sowohl für den zugewiesenen Speicher als auch für die im Speicher abgebildeten Dateien wichtig.
Der Grad der Parallelität hängt in erster Linie von den auf Ihrem Rechner verfügbaren physischen Prozessoren/Kernen ab. Wenn Sie einen Rechner mit nur einem Prozessor/Kern haben, kann es sein, dass separate Prozesse zu viel Overhead verursachen. In diesem Fall wären Threads generell vorzuziehen.
Wenn Sie mehrere Kerne/CPUs haben, können Sie sich, je nachdem, was jeder Prozess/Thread tut, für Prozesse entscheiden, wenn der Overhead gerechtfertigt ist. Prozesse haben natürlich eine viel bessere Speicherisolierung als Threads - aber gleichzeitig sind Prozesse unter Windows im Vergleich zu Threads ziemlich schwerfällig.
Threads können natürlich Daten im selben Prozess gemeinsam nutzen - aber auch hier müsste der Zugriff auf die gemeinsam genutzten Daten synchronisiert werden, um einen fehlerhaften Zustand zu verhindern. Die gemeinsame Nutzung von Daten zwischen Prozessen ist aufwändiger. Der Overhead (der größer ist als bei der einfachen Thread-Synchronisierung) hängt von den verwendeten Mechanismen ab, wie z. B. Named Pipes, benutzerdefinierte Socket-basierte Kommunikation, Verwendung eines Remoting-Frameworks, gemeinsame Datei/Datenbank usw.
Ein paar Links, die Ihnen hoffentlich bei der Entscheidung helfen können:
http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/ http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast
- See previous answers
- Weitere Antworten anzeigen