Concepts et Techniques
Objectifs
Les objectifs de cette vidéo sont de vous apprendre à :
- Comprendre les principes du multiprocessing
- Mettre en œuvre des processus en Python
- Optimiser les programmes pour une meilleure utilisation des ressources CPU
Résumé
Apprenez les fondamentaux du multiprocessing en Python, une méthode essentielle pour exécuter des tâches en parallèle en exploitant plusieurs CPU.
Description
Le multiprocessing en Python est une méthode permettant d'exécuter des tâches en parallèle sur plusieurs CPU. Cette technique améliore les performances des programmes en distribuant les tâches sur différents processus. Chaque processus fonctionne de manière indépendante, réduisant ainsi le temps total d'exécution. Cependant, le coût de communication entre processus doit être inférieur au gain de performance pour justifier l'utilisation du multiprocessing.
Un exemple typique est le traitement en masse de fichiers sur un disque dur, où chaque fichier peut être compressé en parallèle. Python offre une API spécifique pour gérer les processus, avec des outils comme multiprocessing
et processing pool
. La mise en œuvre correcte de cette technique exige de maîtriser la création et la gestion de processus, ainsi que la condition if __name__ == '__main__'
pour éviter des conflits lors de l'exécution du script.
Cette vidéo explore en détail l'utilisation de multiprocessing en Python, démontrant comment configurer et optimiser les processus pour diverses tâches, tout en présentant les avantages et les inconvénients par rapport à l'utilisation des threads.
Je suis vraiment tres satisfait par cette première formation suivie sur Python.
#CODE en python 3.10.0 64 bits (VScode 1.62.3)
import datetime
import asyncio
import aiohttp
import requests
# ----------------------------------------------------------------------------------------------------------------------------
def req_bloquante(num):
print(f"Get {num}")
uid = requests.get("https://httpbin.org/uuid").json()["uuid"]
print(f"Res {num}: {uid}")
def faire_toutes_les_requetes():
for x in range(51):
req_bloquante(x)
print("=====> ### Bloquant : ")
start = datetime.datetime.now()
faire_toutes_les_requetes()
exec_time = (datetime.datetime.now() - start).seconds
print(f"Downloading all take {exec_time} seconds\n")
# ----------------------------------------------------------------------------------------------------------------------------
async def requeteSansBloquer(semaphore, num, session):
print(f"Get {num}")
# await semaphore.acquire() # putting this await semaphore commande the Res is ordering but process very slow ~60 sec
async with session.get("https://httpbin.org/uuid") as response:
uid = (await response.json())["uuid"]
# await asyncio.sleep(delay=3) #delay = number of seconds
# semaphore.release()
print(f"Res {num}: {uid}")
# return uid # ?
async def main():
semaphore = asyncio.Semaphore(value=1)
tasks = []
async with aiohttp.ClientSession(
loop=loop, connector=aiohttp.TCPConnector(ssl=False)
) as session:
for x in range(51):
tasks.append(requeteSansBloquer(semaphore, x, session))
await asyncio.gather(*tasks)
print("This is after the loop...")
if __name__ == "__main__":
print("=====> ### Non Bloquant : ")
start = datetime.datetime.now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
exec_time = (datetime.datetime.now() - start).microseconds
print(f"Downloading all take {exec_time} micro seconds\n")