2015-12-23 7 views
7

Ich habe gelesen über asyncio-Modul in Python 3 und im weiteren Sinne über Coroutinen in Python, und ich kann nicht bekommen, was macht asyncio so ein großartiges Werkzeug. Ich habe das Gefühl, dass alles, was Sie mit Korotinen tun können, Sie können es besser tun, indem Sie Task-Warteschlangen basierend auf dem Multiprocessing-Modul (Sellerie zum Beispiel) verwenden. Gibt es Anwendungsfälle, in denen Korotinen besser als Aufgabenwarteschlangen sind?asyncio und coroutines vs task queues

Antwort

9

Keine richtige Antwort, aber eine Liste von Hinweisen, die nicht in einem Kommentar passen könnte:

  • Sie sind zu erwähnen die multiprocessing Modul (und seien wir threading betrachten). Angenommen, Sie müssen Hunderte von Sockets verarbeiten: Können Sie Hunderte von Prozessen oder Threads generieren?

  • Wieder mit Threads und Prozessen: Wie behandeln Sie den gleichzeitigen Zugriff auf freigegebene Ressourcen? Wie hoch ist der Aufwand für Mechanismen wie Sperren?

  • Frameworks wie Sellerie fügen auch einen wichtigen Overhead hinzu. Kannst du es z. für die Handhabung jede einzelne Anfrage auf einem High-Traffic-Webserver? Übrigens, in diesem Szenario, wer ist verantwortlich für die Handhabung von Steckdosen und Verbindungen (Sellerie für seine Natur kann das nicht für Sie tun)?

  • Lesen Sie unbedingt the rationale behind asyncio. Diese Begründung (unter anderem) erwähnt einen Systemaufruf: writev() - ist nicht viel effizienter als mehrere write() s?

1

auf die obige Antwort hinzu:

Wenn die Aufgabe in der Hand I/O gebunden und arbeitet auf einem gemeinsam genutzten Daten, Koroutinen und asyncio sind wahrscheinlich der Weg zu gehen.

Wenn Sie andererseits über CPU-gebundene Aufgaben verfügen, bei denen Daten nicht freigegeben werden, sollte ein Mehrprozessorsystem wie Sellery besser sein.

Wenn die Aufgabe sowohl eine CPU- als auch I/O-Bindung ist und die gemeinsame Nutzung von Daten nicht erforderlich ist, würde ich immer noch Sellerie verwenden. Sie können asynchrone I/O aus Sellery verwenden!

Wenn Sie eine CPU-gebundene Aufgabe haben, aber Daten gemeinsam nutzen müssen, ist die einzige praktikable Option, wie ich jetzt sehe, die gemeinsamen Daten in einer Datenbank zu speichern. Es gab kürzlich Versuche wie pyparallel, aber sie sind noch in Arbeit.