J'ai essayé python curio.
L'idée de base est d'utiliser async / await. En d'autres termes, cela devient "créer une tâche et la transformer". Les tâches sont déclarées sous forme de fonctions avec le mot-clé ʻasync`. Dans le shell interactif, vous préparerez et exécuterez quelque chose qui "transforme la tâche". Il y a eu «asyncio» depuis longtemps, mais cela peut être «curio». Vous pouvez également appeler la méthode coroutine.
>>> 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» peut être court.
Ceci est une comparaison entre «asyncio» et «curio». ʻAsyncio ne semble pas être la meilleure conception pour async / await, en partie parce que c'était avant la création de la syntaxe async / await (https://vorpus.org/blog/some-ought-on- asynchronous-api-design-in-a-post-asyncawait-world /). Lorsque vous vous habituez à «curio», «asyncio» ressemble à une autoroute sans garde-corps. J'hésite à dire [ce sera plus rapide](https://magic.io/blog/uvloop-blazing-fast-python-networking/) dans ʻuvloop
.
auteur asyncio. https://www.youtube.com/watch?v=m28fiN9y_r8
auteur de curiosités. Le codage en direct est vivant https://www.youtube.com/watch?v=ZzfHjytDceU https://www.youtube.com/watch?v=MCs5OvhV9S4
D'autre part, il y a une habitude considérable d'async / wait. La bibliothèque standard utilise implicitement l'objet socket
à l'intérieur, mais lorsqu'elle est utilisée normalement, les E / S passent en mode de blocage, ce qui rend la combinaison difficile. En plus de la bibliothèque standard, il existe également une bibliothèque qui peut être utilisée comme machine à états en se concentrant sur la partie protocole en supprimant socket
. Par exemple, "h11" et hyper "h2" sont relativement faciles à combiner dans async / await.
auteur h2. https://www.youtube.com/watch?v=7cC3_jGwl_U
Si vous essayez quelques trucs dans cette direction, vous obtiendrez quelque chose comme gevent
, ʻeventlet sans
monkey_patch`. Par rapport à «curio», est-ce que vous avez envie de peser les effets secondaires et la commodité de monkey_patch?
Le problème jusqu'à la toute fin est la connexion à la base de données. Je suis toujours à la recherche d'un cas d'utilisation pour utiliser SQLAlchemy ... Il est difficile de faire un bon analyseur de protocole avec un modèle qui cherche autour d'un gros fichier avec une structure.
Au fait, le document du développeur dit S'il vous plaît, n'utilisez pas Curio!. J'ai ri. Eh bien ... si gevent implémente le PEP492 __await__
, ce serait une verge d'or pour le démon. Je ne suis pas convaincu qu'asyncio ne causera pas d'accident.
Lorsque vous utilisez async / await, il est agréable de pouvoir détecter les fuites d'attente.
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