IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

danielhagnoul

Python. Exemple asynchrone pour Python 3.7+.

Noter ce billet
par , 04/06/2020 à 11h37 (625 Affichages)
Hormis l'utilisation de l'asynchrone, ce code est assez simple, voir les commentaires dans le code.

Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#! python3
# coding: utf-8
 
""" Ce code requiert Python 3.7 ou plus """
 
import time
import requests_async as requests  # https://pypi.org/project/requests-async/
from bs4 import BeautifulSoup      # https://pypi.org/project/beautifulsoup4/
import asyncio
 
 
async def test_1_bs4():
    """ On rend awaitable l'opération I/O qui consomme beaucoup de temps """
    page = await requests.get(
        "http://dataquestio.github.io/web-scraping-pages/simple.html")
 
    """ soup c'est du temps CPU, ce n'est pas awaitable """
    soup = BeautifulSoup(page.content, 'html.parser')
    return soup.p.string
 
 
async def test_2_bs4():
    """ On rend awaitable l'opération I/O qui consomme beaucoup de temps """
    page = await requests.get(
        "https://danielhagnoul.developpez.com/")
 
    """ soup c'est du temps CPU, ce n'est pas awaitable """
    soup = BeautifulSoup(page.content, 'html.parser')
 
    avertir = soup.find(id="avertissement")
    all_p = avertir.find_all('p')
    texte = ''
    for p in all_p[1:]:
        texte += (p.string).strip() + "\n"
    return texte
 
 
async def say_after(delay, what):
    print("before ", what)
    """ On rend cette fonction awaitable en utilisant asyncio.sleep """
    await asyncio.sleep(delay)
    print("after ", what)
    return what
 
choix = [
    "C'est étrange !", "C'est pour qui ?", "C'est pour quoi ?",
    "C'est long ?", "Pas trop !", "C'est bien !",
]
 
 
async def taches_async():
    """ Avec gather, on lance toutes les tâches awaitables en même temps """
    res = await asyncio.gather(
        test_1_bs4(),
        test_2_bs4(),
        *(say_after(1, choix[i]) for i in range(0, 3)),
        *(say_after(1, choix[i]) for i in range(3, 6)),
    )
    return res
 
 
s = time.perf_counter()
 
""" Les réponses sont toujours dans l'ordre des appels """
lst = asyncio.run(taches_async())
 
print("\nResultats :\n")
 
for i, item in enumerate(lst):
    print("{} : {}".format(i, item))
 
elapsed = time.perf_counter() - s
print("\n{} executed in {:0.2f} seconds.".format(__file__, elapsed))
 
""" Le temps d'exécution dépend entièrement des opérations requests. 
    Chez moi cela varie de 1,01 à 12,34 secondes 
"""

Licence Creative Commons Attribution 2.0 Belgique

Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Viadeo Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Twitter Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Google Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Facebook Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Digg Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Delicious Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog MySpace Envoyer le billet « Python. Exemple asynchrone pour Python 3.7+. » dans le blog Yahoo

Commentaires