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