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.
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