Python async / warte auf Kuriosität

Ich habe Python [curio] ausprobiert (http://curio.readthedocs.io/en/latest/).

Die Grundidee ist die Verwendung von async / await. Mit anderen Worten, es wird "eine Aufgabe erstellen und drehen". Aufgaben werden in Form von Funktionen mit dem Schlüsselwort async deklariert. In der interaktiven Shell bereiten Sie etwas vor und führen es aus, das "die Aufgabe dreht". Es gibt schon lange "Asyncio", aber es kann "Curio" sein. Alternativ können Sie die Coroutine-Methode aufrufen.

>>> async def hello():
...     return "Hello"
...
>>> import curio
>>> curio.run(hello())
'Hello'
>>> import asyncio
>>> asyncio.get_event_loop().run_until_complete(hello())
'Hello'
>>> try:
...  hello().send(None)
... except StopIteration as e:
...  e.value
...
'Hello'

curio kann kurz sein.

Wenn dies geschieht, wird es ein Vergleich zwischen "asyncio" und "curio". asyncio scheint nicht das beste Design für async / await zu sein, auch weil es vor der Erstellung der async / await-Syntax war (https://vorpus.org/blog/some- Thoughts-on-") asynchrones-api-design-in-einer-post-asyncawait-welt /). Wenn man sich an "Curio" gewöhnt, fühlt sich "Asyncio" wie eine Autobahn ohne Leitplanken an. Ich zögere zu sagen, dass es mit "uvloop" (https://magic.io/blog/uvloop-blazing-fast-python-networking/) schneller geht.

asyncio Autor. https://www.youtube.com/watch?v=m28fiN9y_r8

Kuriositätenautor. Live-Codierung ist lebendig https://www.youtube.com/watch?v=ZzfHjytDceU https://www.youtube.com/watch?v=MCs5OvhV9S4

Auf der anderen Seite gibt es eine beträchtliche Angewohnheit, sich selbst zu asynchronisieren / zu erwarten. Die Standardbibliothek verwendet implizit das Socket-Objekt im Inneren, aber bei normaler Verwendung wechselt die E / A in den Blockierungsmodus, was die Kombination erschwert. Neben der Standardbibliothek gibt es auch eine Bibliothek, die als Zustandsmaschine verwendet werden kann, indem man sich auf den Protokollteil konzentriert, indem man "Socket" entfernt. Zum Beispiel sind h11 und hyper h2 relativ einfach in async / await zu kombinieren.

h2 Autor. https://www.youtube.com/watch?v=7cC3_jGwl_U

Wenn Sie ein paar Dinge in diese Richtung versuchen, erhalten Sie so etwas wie "gevent", "eventlet" ohne "monkey_patch". Fühlt es sich im Vergleich zu "curio" an, die enormen Nebenwirkungen und die Bequemlichkeit von monkey_patch abzuwägen?

Das Problem bis zum Ende ist die Datenbankverbindung. Ich suche immer noch nach einem Anwendungsfall für die Verwendung von SQLAlchemy ... Es ist schwierig, einen guten Protokollparser mit einem Muster zu erstellen, das eine große Datei mit einer Struktur sucht und umgeht.

Das Entwicklerdokument lautet übrigens Bitte verwenden Sie kein Kuriosum!. Ich lachte. Nun ... wenn gevent das PEP492 __await__ implementiert, wäre es ein Goldstab für den Dämon. Ich bin nicht sicher, dass Asyncio keinen Unfall verursachen wird.

TIPS

Bei Verwendung von async / await ist es hilfreich, Wartelecks erkennen zu können.

if __name__=="__main__":
	import logging
	logging.getLogger("asyncio").setLevel(logging.DEBUG)
	import gc
	gc.set_debug(gc.DEBUG_UNCOLLECTABLE)
	loop = asyncio.get_event_loop()
	loop.set_debug(True)
	try:
		loop.run_forever()
	finally:
		loop.close()

Recommended Posts

Python async / warte auf Kuriosität
Scraping mit Python 3.5 async / await
[Python] Asynchrone Anfrage mit async / await
Spielen Sie Python async
Konvertieren Sie die asynchrone API im Callback-Stil in async / await in Python
Asynchrone Verarbeitung von Python ~ Asynchron vollständig verstehen und warten ~
Scraping mit Python 3.5 Async-Syntax
Leichter Thread-Leistungsbenchmark mit async / await, implementiert in Python 3.5
Python: So verwenden Sie Async mit
Python
Async / warte mit Kivy und tkinter
Async / Await-Syntax Zusammenfassung der verfügbaren Sprachen