Pool de threads
En Python, vous pouvez utiliser un thread pool pour exécuter des tâches simultanément à l'aide d'un ensemble prédéfini de threads. L'avantage d'utiliser un thread pool est qu'il évite la surcharge de la création et de la destruction de threads pour chaque tâche, ce qui peut améliorer les performances.
Le module concurrent.futures de Python fournit une classe ThreadPoolExecutor qui vous permet de créer un pool de threads et de soumettre des tâches. Voici un exemple :
Créez un projet appelé thread_pool_range.py dans le WebIDE et entrez le contenu suivant.
import concurrent.futures
## Définissez une fonction à exécuter dans plusieurs threads avec deux arguments
def ma_fonction(arg1, arg2):
## Définissez les tâches effectuées par le thread ici
print(f"Bonjour depuis mon thread avec les arguments {arg1} et {arg2}")
## Créez un objet ThreadPoolExecutor avec un maximum de 5 threads de travail
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as exécuteur:
## Soumettez chaque tâche (appel de fonction avec ses arguments) à l'exécuteur pour traitement dans un thread séparé
## La méthode submit() renvoie un objet Future représentant le résultat de la computation asynchrone
for i in range(10):
exécuteur.submit(ma_fonction, i, i+1)
Dans cet exemple, nous définissons une fonction ma_fonction qui prend deux arguments. Nous créons un ThreadPoolExecutor avec un maximum de 5 threads de travail. Ensuite, nous parcourons une plage de nombres et soumettons des tâches au thread pool à l'aide de la méthode exécuteur.submit(). Chaque tâche soumise est exécutée sur l'un des threads de travail disponibles.
Conseils : L'objet ThreadPoolExecutor est utilisé comme gestionnaire de contexte. Cela garantit que tous les threads sont correctement nettoyés lorsque le code à l'intérieur du bloc with est terminé.
Utilisez la commande suivante pour exécuter le script.
python thread_pool_range.py
La méthode submit() renvoie immédiatement un objet Future, représentant le résultat de la tâche soumise. Vous pouvez utiliser la méthode result() de l'objet Future pour récupérer la valeur de retour de la tâche. Si la tâche lève une exception, l'appel à result() levera cette exception.
Vous pouvez également utiliser la méthode map() de la classe ThreadPoolExecutor pour appliquer la même fonction à une collection d'éléments. Par exemple, Créez un projet appelé thread_pool_map.py dans le WebIDE et entrez le contenu suivant. :
import concurrent.futures
## Définissez une fonction à exécuter dans plusieurs threads
def ma_fonction(item):
## Définissez les tâches effectuées par le thread ici
print(f"Bonjour depuis mon thread avec l'argument {item}")
## Créez une liste d'éléments à traiter par les threads
éléments = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
## Créez un objet ThreadPoolExecutor avec un maximum de 5 threads de travail
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as exécuteur:
## Soumettez chaque élément à l'exécuteur pour traitement dans un thread séparé
## La méthode map() renvoie automatiquement les résultats dans l'ordre
exécuteur.map(ma_fonction, éléments)
Dans cet exemple, nous définissons une fonction ma_fonction qui prend un argument. Nous créons une liste d'éléments et les soumettons au thread pool à l'aide de la méthode exécuteur.map(). Chaque élément de la liste est passé à ma_fonction en tant qu'argument, et chaque élément est exécuté sur l'un des threads de travail disponibles.
Utilisez la commande suivante pour exécuter le script.
python thread_pool_map.py
Les résultats obtenus à partir de thread_pool_range.py et thread_pool_map.py sont les mêmes.