Multithreading et Multiprocessing en Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Plongez dans un monde où la révolution industrielle a重塑 la société, et où le tumulte de la vie des années victoriennes du 19ème siècle modelise les rues pavées de cailloux. Ici, au milieu des allées brumeuses bordées du bruit des calèches et du bourdonnement lointain des machines d'usine, vit un personnage dont le talent captive les foules bondissantes - un artiste de rue connu pour son incroyable capacité à gérer plusieurs tâches en même temps.

Notre artiste, nommé Oliver, est célèbre pour jongler avec des objets tout en équilibrant sur un monocycle, jouer de la harmonica et résoudre des énigmes complexes simultanément. Pour l'étonnement de son public, les performances d'Oliver sont sans faille et efficaces, témoignant de sa maîtrise des activités concourantes. Ce Lab vise à reproduire la capacité multitâche d'Oliver en explorant les capacités de multithreading et de multiprocessing de Python, afin de s'assurer que les programmeurs puissent gérer plusieurs tâches simultanément sans encombre.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/AdvancedTopicsGroup -.-> python/threading_multiprocessing("Multithreading and Multiprocessing") subgraph Lab Skills python/threading_multiprocessing -.-> lab-271599{{"Multithreading et Multiprocessing en Python"}} end

Comprendre les Threads

Dans cette étape, vous allez apprendre les bases du threading en Python. Le threading vous permet d'exécuter plusieurs opérations de manière concurrente, donnant l'impression que votre programme effectue plusieurs choses en même temps, tout comme la capacité d'Oliver à jongler en pédalant.

Ouvrez un fichier nommé simple_threads.py dans le répertoire ~/project avec le contenu suivant :

import threading
import time

def print_numbers():
    for i in range(1, 6):
        time.sleep(1)
        print(i)

## Créez deux threads
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)

## Démarrez les deux threads
thread1.start()
thread2.start()

## Attendez que les deux threads se terminent
thread1.join()
thread2.join()

print("Terminé avec les nombres!")

Exécutez le code ci-dessus dans le terminal avec :

python simple_threads.py

Vous devriez voir les nombres imprimés de manière alternée par les deux threads, suivi de "Terminé avec les nombres!":

1
1
2
2
3
3
4
4
5
5
Terminé avec les nombres!

Mettre en œuvre le Multiprocessing

Maintenant, utilisons le multiprocessing pour accélérer les calculs. Le multiprocessing en Python permet l'exécution de plusieurs processus, qui peuvent s'exécuter sur différents noyaux CPU, réduisant le temps total requis pour les tâches liées au CPU.

Ouvrez un fichier nommé process_prime.py dans le répertoire ~/project avec le contenu suivant :

from multiprocessing import Process
import math

def is_prime(num):
    """
    Vérifie si un nombre est premier.
    """
    if num <= 1:
        return False
    for i in range(2, int(math.sqrt(num)) + 1):
        if num % i == 0:
            return False
    return True

def compute_primes(start, end):
    """
    Calcule les nombres premiers dans une plage donnée.
    """
    prime_numbers = [num for num in range(start, end) if is_prime(num)]
    print(f"Premiers dans la plage {start}-{end}: {prime_numbers}")

processes = []
## Création de deux processus
for i in range(0, 20000, 10000):
    ## Crée un nouveau processus ciblant la fonction compute_primes et passant la plage en arguments
    p = Process(target=compute_primes, args=(i, i+10000))
    processes.append(p)
    ## Démarre le processus
    p.start()

## Attend que tous les processus se terminent
for p in processes:
    p.join()

print("Terminé avec le calcul des nombres premiers!")

Exécutez le script dans le terminal :

python process_prime.py

Cela affichera les nombres premiers trouvés dans les plages spécifiées et affichera un message de fin :

Premiers dans la plage 0-10000: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241,
......
9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]
Premiers dans la plage 10000-20000: [10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193,
......
19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997]
Terminé avec le calcul des nombres premiers!

Sommaire

Dans ce laboratoire, nous avons entrepris un parcours captivant pour déplier les subtilités du threading et du multiprocessing en Python, similaire aux performances multi-couches des artistes de rue victoriens. Nous avons commencé par jongler avec les tâches à l'aide de threads puis avons monté en puissance pour traiter des opérations lourdes sur les noyaux CPU. Cette expérience a non seulement démontré les capacités parallèles de Python mais a également révélé comment ces techniques ont une signification dans le monde réel, similaire aux présentations multifacettes de compétences de notre personnage, Oliver.

Ce que vous devriez retenir de ce laboratoire est une compréhension claire des threads Python pour les tâches liées à l'E/S et des processus pour les tâches liées au CPU, améliorant ainsi efficacement votre performance de codage et rendant vos applications plus efficaces.