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
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 wirthreading
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 mehrerewrite()
s?
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.
- 1. Asyncio coroutines
- 2. testing task queues und pipeline api bei Funktionstests
- 3. Unterschiede zwischen Coroutines und `goto`?
- 4. Google App Engine: bucket_size Parameter auf Task-Queues
- 5. GAE Task Queues, wie die Verzögerung zu machen?
- 6. Multiprozessing vs Threading vs asyncio in Python 3.4
- 7. Coroutines in Java
- 8. Coroutines in C#
- 9. Monitor Dateiänderung - Asyncio und Flask
- 10. Asynchron zu Azure Queues veröffentlichen
- 11. Verketten von Coroutinen in asyncio (und Beobachtermuster)
- 12. Java Priority Queues und vergleichbare Schnittstelle
- 13. Run tornado.testing.AsyncTestCase mit asyncio Ereignisschleife
- 14. Mercurial Queues: Kombinieren Patches
- 15. ensure_future nicht im Modul asyncio
- 16. Core Audio Queues Cracking
- 17. Ordnungsgemäßes Herunterfahren von asyncio-Tasks
- 18. Multi-Thread-asyncio in Python
- 19. Spring Task Scheduler vs Java ScheduledExecutorService
- 20. Task Parallele Bibliothek vs Native Thread Synchronisation
- 21. Node Coroutines Parallel Flow Control mit Generatoren und Promise
- 22. PyQt5 und asyncio: Ausbeute von nie beendet
- 23. Python asyncio Erklärungen und Signale Handler
- 24. Python asyncio run forever und Interprozess-Kommunikation
- 25. Message Queue vs Task Queue Unterschied
- 26. Task Verzögerung vs Thread Sleep Auflösung Genauigkeit
- 27. Workitems, Workgroups und Command Queues Organisation und Speicherlimit in OpenCL
- 28. NServiceBus Message Queues baut auf
- 29. Funktioniert PyPy mit asyncio?
- 30. Lightweight asyncio web server