Sollte ich Gabel oder Gewinde verwenden?

8

In meinem Skript habe ich eine Funktion foo , die im Grunde pynotify verwendet, um Benutzer nach einem Zeitintervall von 15 Minuten wiederholt über etwas zu informieren.

%Vor%

Mein Hauptskript muss mit Benutzer & amp; tut alles andere so kann ich die Funktion foo () einfach nicht nennen. direkt.

  

Was ist der bessere Weg, es zu tun und warum ?   Mit Gabel oder Fäden?

    
Abhijeet Rastogi 20.03.2010, 12:07
quelle

5 Antworten

9

Ich werde dir nicht sagen, welches man verwenden soll, aber hier sind einige der Vorteile von jedem:

Threads können schneller als Prozesse starten, und Threads verwenden weniger Betriebssystemressourcen als Prozesse, einschließlich Speicher, Dateihandles usw. Threads bieten Ihnen auch die Möglichkeit, über gemeinsam genutzte Variablen zu kommunizieren (obwohl viele würde sagen, das ist eher ein Nachteil als ein Vorteil - siehe unten).

Prozesse haben jeweils eigene Speicher und Variablen, was bedeutet, dass Prozesse im Allgemeinen miteinander kommunizieren, indem sie Nachrichten senden. Dies ist viel einfacher richtig als Threads über den gemeinsamen Speicher kommunizieren zu lassen. Prozesse können auch wirklich gleichzeitig ausgeführt werden, sodass Sie, wenn Sie mehrere CPU-Kerne haben, alle davon behalten können Sie beschäftigen sich mit Prozessen. In Python * verhindert die globale Interpretersperre , dass Threads viel mehr als einen einzigen verwenden können Kern.

* - Das ist CPython, das die Implementierung von Python, die Sie erhalten, wenn Sie Ссылка aufrufen und herunterladen Python. Andere Python-Implementierungen (wie zB Jython ) verbieten es Python nicht, Threads gleichzeitig auf mehreren CPUs auszuführen. Danke an @EOL für die Klärung.

    
Joe Carnahan 20.03.2010, 12:53
quelle
4

Für diese Art von Problemen scheinen weder Threads noch gegabelte Prozesse der richtige Ansatz zu sein. Wenn Sie nur einmal alle 15 Minuten den Benutzer über etwas informieren möchten, warum nicht eine Ereignisschleife wie die von GLib oder Twisted verwenden? Auf diese Weise können Sie Vorgänge planen, die ab und zu ausgeführt werden sollten, und mit dem Rest Ihres Programms fortfahren.

    
Thomas Vander Stichele 20.03.2010 14:58
quelle
4

Mit mehreren Prozessen können Sie mehrere CPU-Kerne gleichzeitig ausnutzen, während in CPython das Verwenden von Threads nicht funktioniert (Threads wechseln sich mit einem einzelnen CPU-Kern ab) - also, wenn Sie CPU-intensiv arbeiten und unbedingt wollen Um Threads zu verwenden, sollten Sie Jython oder IronPython in Betracht ziehen. Mit CPython reicht diese Überlegung oft aus, um die Wahl auf das multiprocessing -Modul und weg von threading one zu lenken (sie bieten ziemlich ähnliche Schnittstellen, weil multiprocessing so entworfen wurde, dass sie leicht anstelle von% co_de eingesetzt werden kann) %).

Abgesehen von dieser entscheidenden Überlegung sind Threads unter Windows (wo ein neuer Prozess eine schwere Aufgabe ist) oft die bessere Wahl (performance-weise), aber weniger oft unter Unix-Varianten (Linux, BSD-Versionen, OpenSolaris, MacOSX) (...), da ein neuer Prozess dort schneller ist (aber wenn Sie IronPython oder Jython verwenden, sollten Sie auf den Plattformen, die Ihnen wichtig sind, überprüfen, dass dies immer noch in den betreffenden virtuellen Maschinen gilt - CLR mit entweder .NET oder Mono für IronPython, Ihre bevorzugte JVM für Jython).

    
Alex Martelli 20.03.2010 15:00
quelle
3

Prozesse sind viel einfacher. Drehen Sie sie einfach los und lassen Sie das OS damit umgehen.

Außerdem sind Prozesse oft viel effizienter. Prozesse teilen keinen gemeinsamen Pool von E / A-Ressourcen. Sie sind völlig unabhängig.

Pythons subprocess.Popen behandelt alles.

    
S.Lott 20.03.2010 12:26
quelle
1

Wenn du mit fork meinen willst, dann würde ich es vermeiden. Es ist nicht plattformübergreifend und zu niedrig - Sie müssten die Kommunikation zwischen den Prozessen selbst implementieren.

Wenn Sie einen separaten Prozess verwenden möchten, verwenden Sie entweder das Unterprozessmodul oder, wenn Sie auf Python 2.6 oder höher sind, das neue Multiprocessing Modul. Dies hat eine sehr ähnliche API wie das Threading-Modul, also könnten Sie mit Threads beginnen und dann einfach zu Prozessen wechseln oder umgekehrt.

Für das, was Sie tun wollen, würde ich Threads verwenden, außer """does something""" ist CPU-intensiv und Sie möchten mehrere Kerne nutzen, was ich in diesem speziellen Fall bezweifle.

    
Dave Kirby 20.03.2010 12:53
quelle

Tags und Links