Comment écrire du code Asynchrone en Python<span class="wtr-time-wrap after-title"><span class="wtr-time-number">9</span> min read</span>
python asynchrone

Comment écrire du code Asynchrone en Python9 min read

Python est un langage de programmation synchrone, il exécute les actions les unes après les autres. Dans l’ordre dans lesquelles elles sont écrites. 

C’est le fonctionnement classique des langages de programmation. Bien sûr, des fonctions peuvent être écrites dans d’autres fichiers. Mais lors de l’appel, le code sera lu de haut en bas.

Si vous ne connaissez pas le système asynchrone, ce que je dis peut sembler évident. Pourquoi est-ce que ça fonctionnerai autrement ?

Et bien, sachez qu’il est possible d’écrire du code qui ne s’exécute pas de haut en bas ? Si vous vous demandez à quoi ça sert, je vous invite à lire cet article

Le fonctionnement du code asynchrone en Python

Je vais quand même vous donner quelques détails ici, si vous exécutez une requête HTTP par exemple, tout votre programme sera mis en pause en attendant la réponse, ce qui réduit les performances. 

Pour palier à ce problème, on utilise généralement un thread qui va gérer le processus de manière autonome. Mais ce système va réduire la puissance du programme. Une autre manière de le faire, c’est d’exécuter d’autres actions durant la requête, c’est le principe du code asynchrone.

On utilise donc l’asynchronisme pour améliorer les performances d’un site web par exemple. Des frameworks comme Tornado permettent de le faire

Dans cet article, nous allons voir comment écrire du code asynchrone en Python

L’écriture de code asynchrone en Python

Python permets facilement d’écrire du code asynchrone. Pour gérer plusieurs tâches, vous avez peut-être déjà utilisé les co routines ou le threading, et bien l’asynchronisme est bien plus simple à mettre en place, et ce grâce à la librairie asyncio

La librairie Asyncio

Asyncio est une librairie développée par le créateur de Python, il as passé plusieurs années dessus et elle est directement intégrée au langage, c’est un module.

Ce module ajoute des mots clés directement présents dans le langage, async et await. Ces mots clés sont aussi présents dans d’autres langages asynchrones comme Node JS par exemple. Ces compétences sont donc applicables dans d’autres langages.

Asyncio utilise le système complexe des coroutines qui permettent de laisser un processus prendre le relai sur un autre grâce à un yield. Tout est simplifié grâce à ces deux mots clés, mais la logique derrière est très complexe.

Sans trop rentrer dans les détails car toute la théorie complexe est expliquée dans l’article cité plus haut, Python utilisera aussi un système de boucle d’événements pour savoir quelle tâche effectuer et quelles tâches sont en attente.

Un exemple pratique de code asynchrone

Pour vous illustrer comment fonctionne le code asynchrone, je vais utiliser un exemple simple, et utilisé dans presque tous les tutoriels anglophones. Pourquoi ? Et bien car il illustre parfaitement le fonctionnement du code asynchrone

Je tiens à préciser qu’il est impossible de tout expliquer, cette librairie est complexe et si vous voulez vraiment la maîtriser, vous devez lire la documentation ou regarder une longue formation sur YouTube.

Dans notre exemple, nous allons exécuter des requêtes HTTP sur reddit. Théoriquement, le code devra attendre que la requête 1 soit terminée pour aller à la requête deux, mais le code asynchrone vous permettra de gagner du temps puisque les 3 requêtes seront exécutés en même temps.

Lorsque l’on lance une boucle asynchrone, toutes les actions sont exécutés dans un ordre non synchrone. Pour déclarer une fonction asynchrone, on utilise le mot clé async

Lorsque vous exécutez du code asynchrone, vous aurez parfois besoin d’attendre la fin d’une tâche avant d’aller à la suivante dans la fonction, typiquement vous ne pourrez pas afficher le résultat avant de l’avoir téléchargé. Dans ce cas, on utilise le mot clé await sur la tâche à attendre.

import signal  
import sys  
import asyncio  
import aiohttp  
import json

loop = asyncio.get_event_loop()  
client = aiohttp.ClientSession(loop=loop)

async def get_json(client, url):  
    async with client.get(url) as response:
        assert response.status == 200
        return await response.read()

async def get_reddit_top(subreddit, client):  
    data1 = await get_json(client, 'https://www.reddit.com/r/' + subreddit + '/top.json?sort=top&amp;t=day&amp;limit=5')

    j = json.loads(data1.decode('utf-8'))
    for i in j['data']['children']:
        score = i['data']['score']
        title = i['data']['title']
        link = i['data']['url']
        print(str(score) + ': ' + title + ' (' + link + ')')

    print('DONE:', subreddit + '\n')

def signal_handler(signal, frame):  
    loop.stop()
    client.close()
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

asyncio.ensure_future(get_reddit_top('python', client))  
asyncio.ensure_future(get_reddit_top('programming', client))  
asyncio.ensure_future(get_reddit_top('compsci', client))  
loop.run_forever() 

Ce code utiliser des fonctions de la librairie asyncio pour gérer des co routines et donc exécuter nos trois actions en même temps. 

Il nous renverra bien les réponses de nos trois requêtes : 

50: Undershoot: Parsing theory in 1965 (http://jeffreykegler.github.io/Ocean-of-Awareness-blog/individual/2018/07/knuth_1965_2.html)
12: Question about best-prefix/failure function/primal match table in kmp algorithm (https://www.reddit.com/r/compsci/comments/8xd3m2/question_about_bestprefixfailure_functionprimal/)
1: Question regarding calculating the probability of failure of a RAID system (https://www.reddit.com/r/compsci/comments/8xbkk2/question_regarding_calculating_the_probability_of/)
DONE: compsci

336: /r/thanosdidnothingwrong -- banning people with python (https://clips.twitch.tv/AstutePluckyCocoaLitty)
175: PythonRobotics: Python sample codes for robotics algorithms (https://atsushisakai.github.io/PythonRobotics/)
23: Python and Flask Tutorial in VS Code (https://code.visualstudio.com/docs/python/tutorial-flask)
17: Started a new blog on Celery - what would you like to read about? (https://www.python-celery.com)
14: A Simple Anomaly Detection Algorithm in Python (https://medium.com/@mathmare_/pyng-a-simple-anomaly-detection-algorithm-2f355d7dc054)
DONE: python

1360: git bundle (https://dev.to/gabeguz/git-bundle-2l5o)
1191: Which hashing algorithm is best for uniqueness and speed? Ian Boyd's answer (top voted) is one of the best comments I've seen on Stackexchange. (https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed)
430: ARM launches “Facts” campaign against RISC-V (https://riscv-basics.com/)
244: Choice of search engine on Android nuked by “Anonymous Coward” (2009) (https://android.googlesource.com/platform/packages/apps/GlobalSearch/+/592150ac00086400415afe936d96f04d3be3ba0c)
209: Exploiting freely accessible WhatsApp data or “Why does WhatsApp web know my phone’s battery level?” (https://medium.com/@juan_cortes/exploiting-freely-accessible-whatsapp-data-or-why-does-whatsapp-know-my-battery-level-ddac224041b4)
DONE: programming

Comme vous pouvez le voir, le code est très rapide, faites le test avec un code synchrone et utilisez un chronomètre , le code asynchrone est trois fois plus rapide.

Comment le code asynchrone optimise les performances

Je vais maintenant vous donner un exemple virtuel de code asynchrone afin que les choses soient plus claires pour vous. On dit que le code asynchrone optimise les performances du programme, et bien nous allons utiliser la métaphore de la cuisine.

Lorsque vous préparez un plat, vous allez mettre vos légumes à cuire, pendant ce temps la préparer votre viande, la mettre à cuire et ensuite préparer autre chose. Ce système est asynchrone, vous faites autre chose pendant les temps d’attente.

La préparation d’un plat de manière synchrone, ça serait attendre que chaque aliment est totalement prêt avant de passer au suivant. Cette méthode rendrait les temps de préparation atrocement longs.

Le code asynchrone optimise donc les performances d’un programme en effectuant les tâches de manière intelligente. Il va faire autre chose durant les temps d’attente au lieu de patienter bêtement.

En conclusion

Le code asynchrone permets d’optimiser les performances d’un programme en supprimant les temps d’attente et en effectuant les tâches de manière intelligente.

En Python, on utilise la librairie asyncio et les mots clé async et await pour effectuer des tâches de manière asynchrone.

C’est une technologie très puissante mais assez complexe. Pour bien la maîtriser, vous aurez à lire la documentation. C’est un processus long mais une fois terminé, vous pourrez créer des programmes et des sites internet très rapide ! 

Si cet article vous as plu, vous pouvez vous abonner à ma newsletter pour recevoir le guide GRATUIT pour bien débuter la programmation

Vous abonner à notre newsletter

* champ requis

Si cet article vous as plu, je vous invite à me laisser un commentaire, je me ferai un plaisir de vous répondre. Si vous avez une question ou une requête de tutoriel , vous pouvez m’envoyer un mail à cet adresse : gailen@smartsiliconsystem.com

Je vous souhaite une bonne journée, au plaisir de vous voir sur mon blog !

Laisser un commentaire

Fermer le menu
×
×

Panier