multiprocessing multithreading oder
Ich bin der Gestaltung einer dedizierten syslog-Verarbeitung-daemon für Linux, der muss robust und skalierbar, und ich bin debattieren Multithreading vs. Multiprozess.
Den offensichtlichen Widerspruch mit multithreading ist die Komplexität und böse Fehler.
Multi-Prozesse auf die Leistung auswirken kann, da der IPC-Kommunikation und Kontextwechsel.
"The Art of Unix Programming", beschreibt dieser hier.
Würden Sie empfehlen, ein Prozess-basiertes system (wie beim Apache) oder multi-threaded-Ansatz?
- Ich bin nicht sicher, dass Sie genügend Informationen über Ihr Ziel/Anforderungen zu bieten, eine Stellungnahme zu diesem
- Apache ist nicht necesseraly multi-threaded oder multi-Prozess. Können Sie es kompilieren, damit es verwendet entweder dieser Modelle. Es kann sogar Arbeit in keinem von denen. Obwohl ich es noch nicht gesehen haben verwendet, kompiliert in asynchronious-Modus, er funktioniert auch so.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide von Ihnen können komplizierte und komplexe, auf Ihre eigene Weise.
Können Sie entweder. In den großen Plan der Dinge, ist es vielleicht nicht egal, welche Sie wählen. Was nicht egal ist, wie gut Sie Ihnen tun. Daher:
Tun, was Sie am meisten Erfahrung mit.
Oder wenn Ihr die Leitung eines Teams, das tun, was das team am meisten Erfahrung mit.
---Threading -! - - -
Ich habe eine Menge threaded-Programmierung, und ich genieße, Teile und Teile von ihm, die ich nicht genießen. Ich habe viel gelernt, und jetzt kann in der Regel schreiben Sie einen multi-threaded-Anwendung, ohne zu viel Schmerzen, aber es muss geschrieben werden, in einer ganz bestimmten Art und Weise. Nämlich:
1) Es muss geschrieben werden, mit klar definierten Daten-Grenzen, die sind 100% thread-safe. Ansonsten, was auch immer Bedingung, dass passieren kann, wird passieren, und es könnte nicht sein, wenn Sie einen debugger rumfliegen.. Plus Debuggen von threaded code ist wie peering in Schrodinger ' s box... Durch einen Blick in es, andere threads dürfen oder vielleicht hatten Sie einfach keine Zeit mehr.
2) Es wird geschrieben mit dem test-code, betont der Maschine. Viele multi-threaded-Systeme zeigen nur Ihre Fehler, wenn die Maschinen stark beansprucht.
3) Es hat eine sehr intelligente person ist, wer der Eigentümer der Daten den Austausch von code. Wenn es irgendeinen Weg gibt, für eine Verknüpfung gemacht werden, einige Entwickler machen es wahrscheinlich, und Sie haben eine fehlerhafte bug.
4) Es muss die catch-all-Situationen, wird das Programm zurückgesetzt werden mit einem minimum an Aufwand. Dies ist für die Produktion von code, der bricht, weil einige threading-Problem. Kurz: Die show muss weitergehen.
---Cross-Prozess!---
Habe ich weniger Erfahrung mit Prozess-basiertes threading, aber vor kurzem wurden dabei einige cross-process-Sachen in Windows (wo die IPC ist ein web-service-Aufrufe... WOO!), und es ist relativ sauber und einfach, aber ich Folge einige Regeln auch hier. Im großen und ganzen, die Kommunikation zwischen Prozessen wird viel mehr fehlerfrei, weil Programme erhalten Signale von der Außenwelt sehr gut.. und diese Transportmechanismen sind in der Regel asynchron. Anyway...
1) Definieren Sie klare Prozessgrenzen und Kommunikationsmechanismen. Nachricht/eventing über, oh sagen, TCP oder web-services oder von Leitungen oder was auch immer ist in Ordnung, solange die Grenzen klar sind, und es gibt eine Menge von Validierung und error-checking code in diesen Grenzen.
2) bereit, für Engpässe. Code Vergebung ist sehr wichtig. Damit meine ich, dass manchmal werden Sie nicht in der Lage zu schreiben, dass Rohr. Sie werden in der Lage, requeue, und wiederholen Sie diese Nachrichten, ohne die Anwendung sperren/wirft eine Ausnahme.
3) Es wird eine Menge mehr code im Allgemeinen, weil Sie den Transport von Daten über Prozessgrenzen hinweg bedeutet, dass Sie haben, um es zu serialisieren und in gewisser Weise. Dies kann eine Quelle von Problemen sein, vor allem, wenn Sie beginnen, beizubehalten und zu ändern, dass code.
Hoffe, das hilft.
Hängt davon ab, welche Programmiersprache Sie verwenden möchten (und die Bibliotheken).
Ich persönlich wählen würde, multithreading, wie ich weiß, die Probleme mit threads (und wie man Sie lösen).
Multiprocessing könnte Ihnen helfen, wenn Sie möchten, führen Sie den Dämon auf mehreren Maschinen und verteilen die Last unter Ihnen, aber ich glaube nicht, dass das ein großes problem hier.
Hast du Links zu vielen details. Tatsächlich, in dem, was Sie haben bereits erklärt, die Wahl ist irrelevant und es ist nichts von Natur aus mehr buggy über multithreading als multiprocessing; Sie fehlt, warum diese Techniken haben einen so guten Ruf. Wenn Sie nicht die Freigabe von Daten, dann gibt es nicht viel problem zu haben (natürlich, kann es einige andere Fragen, aber wir müssen die details entscheiden über die). Auch, es ist wichtig, was Plattform, auf UNIX-artigen Betriebssystemen, Prozesse sind ziemlich leicht sowieso.
Allerdings gibt es auch andere Aspekte zu berücksichtigen? Welche Art von system(s) werden Sie ausgeführt? Sie definitiv nicht wollen, um zu laichen mehrere Prozesse auf einem einprozessorsystem als Sie nicht gehen, um viel profitieren, abhängig von einigen anderen details, die Sie angeben konnte. Wenn Sie beschreiben die Natur des Problems, das Sie zu lösen versuchen, können wir weiter helfen.
Wenn Sie möchten, Robustheit, verwenden Sie multi-processing.
Die Prozesse teilen sich die logging-Last zwischen Ihnen. Früher oder später, eine Protokollierung der Anfrage wird auf einen Fehler und Absturz der logger. Mit multi-processing, verlieren Sie nur einen Prozess, so dass nur das eine Protokollierung der Anfrage (die konnte man nicht sowieso bearbeitet, wegen der Fehler).
Multi-threading ist anfällig für Abstürze, da ein fataler Fehler nimmt Ihre einzigen Prozess.
Mulit-processing ist in mancher Hinsicht noch technisch anspruchsvoll, denn Sie müssen das Gleichgewicht zwischen Arbeitsbelastung über Prozesse, die bewirken können, mit shared memory.
Müssen Sie teilen die Aktualisierung der Daten zwischen den Instanzen, wo die updates sind Häufig und IPC zu teuer wäre? In diesem Fall multithreading ist vermutlich besser. Ansonsten muss man abwägen, ob die Robustheit der eigenen Prozesse oder die Leichtigkeit der thread-Erstellung/Kommunikation ist Ihnen wichtiger.
Frage, ob es notwendig ist, entweder zu tun. Ich weiß nicht, die details Ihrer Anforderungen, aber ein single-threaded-app mit
select(2)
passen kann Ihr benötigt und nicht die Nachteile, die entweder Prozesse oder threads. Dies erfordert, dass Sie in der Lage sein, zu zentralisieren alle Ihre I/O in eine zentrale Stelle, die meisten wahrscheinlich-Versand an andere Module über Rückrufe, die aber nicht allzu schwer, es sei denn, Sie haben eine Menge von Bibliotheken, die wollen, um Ihre eigenen I/O und können nicht umgebaut werden auf diese Weise.Danke an alle für Ihr feedback.
Habe ich beschlossen, eine multi-Prozess-Architektur, ähnlich der Apache-web-server.
Das Verfahren skaliert sehr schön auf multi-Prozessor - /core-Systemen.
Die Kommunikation erfolgt mit pipes oder sockets.
Prozesse werden bereit sein, zu verwenden, die in einem Prozess-pool, so gibt es keine Prozess -, Laich-Kosten.
Die Leistung wird als vernachlässigbar im Vergleich zu der Robustheit werde ich gewinnen.
Gut, wir endlich implementiert als eine multi-verarbeitet-system mit Rohren für IPC und Buchhalter, die spawns Prozesse, wie gebraucht. Ähnlich wie der Apache httpd. Es funktioniert perfekt.