Multiprocessing vs Multithreading vs Asyncio in Python 3


105

Ich habe festgestellt, dass es in Python 3.4 nur wenige verschiedene Bibliotheken für Multiprocessing / Threading gibt: Multiprocessing vs Threading vs Asyncio .

Aber ich weiß nicht, welches ich verwenden soll oder welches das "empfohlene" ist. Tun sie dasselbe oder sind sie unterschiedlich? Wenn ja, welches wird für was verwendet? Ich möchte ein Programm schreiben, das Multicores in meinem Computer verwendet. Aber ich weiß nicht, welche Bibliothek ich lernen soll.


Antworten:


79

Sie sind für (geringfügig) unterschiedliche Zwecke und / oder Anforderungen vorgesehen. CPython (eine typische Python-Hauptimplementierung) verfügt weiterhin über die globale Interpretersperre, sodass eine Multithread-Anwendung (heutzutage eine Standardmethode zur Implementierung der Parallelverarbeitung) nicht optimal ist. Deshalb multiprocessing kann man es vorziehen threading. Da jedoch möglicherweise nicht jedes Problem effektiv in [fast unabhängige] Teile aufgeteilt wird, besteht möglicherweise ein Bedarf an intensiver Interprozesskommunikation. Das ist der Grund, warum multiprocessinges threadingim Allgemeinen nicht vorzuziehen ist .

asyncio(Diese Technik ist nicht nur in Python verfügbar, sondern auch in anderen Sprachen und / oder Frameworks, z. B. Boost.ASIO ) ist eine Methode, mit der viele E / A-Operationen aus vielen gleichzeitigen Quellen effektiv verarbeitet werden können, ohne dass paralleler Code ausgeführt werden muss . Es ist also nur eine Lösung (in der Tat eine gute!) Für eine bestimmte Aufgabe, nicht für die Parallelverarbeitung im Allgemeinen.


7
Es wird darauf hingewiesen, dass alle drei möglicherweise keine Parallelität erreichen, jedoch alle gleichzeitig (nicht blockierende) Aufgaben ausführen können.
Sargas

65

[Schnelle Antwort]

TL; DR

Die richtige Wahl treffen:

Wir haben die beliebtesten Formen der Parallelität durchlaufen. Aber die Frage bleibt - wann sollte man sich entscheiden? Es kommt wirklich auf die Anwendungsfälle an. Aufgrund meiner Erfahrung (und meines Lesens) neige ich dazu, diesem Pseudocode zu folgen:

if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")
  • CPU Bound => Multi Processing
  • E / A-gebunden, schnelle E / A, begrenzte Anzahl von Verbindungen => Multi-Threading
  • E / A gebunden, langsame E / A, viele Verbindungen => Asyncio

Referenz


[ HINWEIS ]:

  • Wenn Sie eine Long - Call - Methode (dh ein Verfahren , das mit einer Schlafzeit oder faul I / O enthalten) haben, ist die beste Wahl asyncio , Verdreht oder Tornado - Ansatz (Koroutine Methoden), das Arbeiten mit einem einzigen Thread als Gleichzeitigkeit.
  • asyncio funktioniert unter Python3.4 und höher.
  • Tornado und Twisted sind seit Python2.7 bereit
  • uvloop ist eine ultraschnelle asyncioEreignisschleife ( uvloop macht asyncio2-4x schneller).

[UPDATE (2019)]:

  • Japranto ( GitHub ) ist ein sehr schneller Pipelining-HTTP-Server, der auf uvloop basiert .

Wenn ich also eine Liste mit URLs anfordern möchte, ist es besser, Asyncio zu verwenden ?
Mingchau

1
@mingchau, Ja, aber denken Sie daran, Sie können verwenden, asynciowenn Sie von erwarteten Funktionen verwenden, requestBibliothek ist keine abwartende Methode, stattdessen können Sie wie die aiohttpBibliothek oder Async-Anfrage usw. verwenden
Benyamin Jafari

Bitte erweitern Sie SlowIO und FastIO, um Multithread oder Asyncio zu verwenden.
qrtLs

@qrtLs Wenn Sie ein SlowIO haben, ist AsyncIO sehr hilfreich und effizienter.
Benyamin Jafari

1
@variable I / O-gebunden bedeutet, dass Ihr Programm die meiste Zeit mit einem langsamen Gerät wie einer Netzwerkverbindung, einer Festplatte, einem Drucker oder einer Ereignisschleife mit einer Ruhezeit spricht. Im Blockierungsmodus können Sie also zwischen Threading oder Asyncio wählen. Wenn Ihr Begrenzungsabschnitt sehr langsam ist, ist kooperatives Multitasking (Asyncio) die bessere Wahl (dh Vermeidung von Ressourcenmangel, Deadlocks und Rennbedingungen)
Benyamin Jafari

8

Dies ist die Grundidee:

Ist es IO- GEBUNDEN? ---------> VERWENDUNGasyncio

IST ES CPU- SCHWER? -----> VERWENDUNGmultiprocessing

SONST? ----------------------> VERWENDUNGthreading

Halten Sie sich also grundsätzlich an das Threading, es sei denn, Sie haben E / A / CPU-Probleme.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.