DuniterPy sans aiohttp/asyncio

Je viens de faire un gros travail ce week-end pour simplifier DuniterPy.

A ma connaissance, personne n’utilise la puissance d’aiohttp qui permet de faire des millions de requêtes concurrentes. Pour accéder à l’api de Duniter, ça n’a pas de sens.

De plus, aiohttp oblige à taguer toutes les fonctions qui l’utilise avec les mots clefs async/await. async à la déclaration de la fonction, await à son appel.

Ainsi, les exemples sont difficiles à comprendre, surtout quand on débute en python, et nécessitent l’utilisation d’une boucle d’événement pour lancer les fonctions asynchrones. C’est une contrainte forte pour l’intégration de DuniterPy dans de petits scripts qui se veulent légers.

aiohttp est aussi utilisé dans Sakia et soulève des problèmes supplémentaires. Sakia utilise le cadre d’application Qt, et celui-ci est asynchrone de-facto, avec sa propre boucle d’évènement. Pour pouvoir utiliser aiohttp avec Qt, on doit installer une rustine, squamash qui va synchroniser les deux boucles !
De plus, asyncio est connu pour sa très mauvaise gestion des erreurs. Les exceptions qui se produisent au sein de asyncio ne donne pas d’informations suffisantes pour tracer les bugs. Et nous avons un bug critique dans Sakia avec asyncio, mais sans informations sur sa cause il reste impossible à corriger.

Sakia va donc utiliser les fonctions asynchrone de Qt (Qt concurrent) qui sont parfaitement intégrées au cadre d’application. On pourra alors retirer aiohttp et tous les tags async/await. Mais avant cela il fallait aussi que DuniterPy soit débarrassé de aiohttp et asyncio.

Avec une bibliothèque neutre (urllib et websocket sont utilisés), vous pouvez choisir la technologie que vous désirez pour faire des requêtes en parallèle (thread, asyncio, trio, etc). Un exemple est fourni : request_data_async.py qui permet de faire du asyncio comme avant. Il n’y a donc pas de régression.

Je vous met ici la version 1.0.0 alpha.

duniterpy-1.0.0a0-py3-none-any.whl (87,8 Ko)

Installation dans un environnement virtuel python :

pip install duniterpy-1.0.0a0-py3-none-any.whl

Installation dans votre compte utilisateur :

pip install --user duniterpy-1.0.0a0-py3-none-any.whl

Pour avoir les exemples à jour sans asyncio, il faut cloner la branche remove_asyncio du dépôt :

git clone --branch remove_asyncio https://git.duniter.org/clients/python/duniterpy.git

Ou pour avoir seulement la branche concernée :

git clone --branch remove_asyncio --single-branch https://git.duniter.org/clients/python/duniterpy.git

@moul, @matograine, @tuxmain, @poka, et ceux que j’oublie, merci de tester les exemples et de me faire des retours.

5 Likes

Thank you for your work!

Even though cpython might not be best for exploiting hardware/cores in separate processes, I still believe strongly that threads are a better way to achieve performance and avoid blocking. That said, Ive avoided learning about async simply because I haven’t been forced to learn it (haven’t had to support performance/production for many years). Im not convinced that avoid async is a step forward for duniterpy (or its programmers; very cool that we can choose to still use it)… but I thank you anyways (I can remain lazy :frowning: ).

Spencer971

on second thought… I can argue that it IS a step forward… it’s yet another choice, expressing liberty, and can still use the higher-performance async like before. Nice work vit!

1 Like