Maison > développement back-end > Tutoriel Python > # Boostez vos tâches Python avec `ThreadPoolExecutor`

# Boostez vos tâches Python avec `ThreadPoolExecutor`

Barbara Streisand
Libérer: 2024-12-09 13:12:11
original
612 Les gens l'ont consulté

# Boost Your Python Tasks with `ThreadPoolExecutor`

Lorsqu'il s'agit d'exécuter plusieurs tâches simultanément en Python, le module concurrent.futures est un outil puissant et simple. Dans cet article, nous explorerons comment utiliser ThreadPoolExecutor pour exécuter des tâches en parallèle, ainsi que des exemples pratiques.

Pourquoi utiliser ThreadPoolExecutor ?

En Python, les threads sont parfaits pour les tâches où les opérations d'E/S dominent, telles que les appels réseau ou les opérations de lecture/écriture de fichiers. Avec ThreadPoolExecutor, vous pouvez :

  • Exécutez plusieurs tâches simultanément sans gérer manuellement les threads.
  • Limitez le nombre de threads actifs pour éviter de surcharger votre système.
  • Collectez facilement les résultats grâce à son API intuitive.

Exemple : exécuter des tâches en parallèle

Regardons un exemple simple pour comprendre le concept.

Le code

from concurrent.futures import ThreadPoolExecutor
import time

# Function simulating a task
def task(n):
    print(f"Task {n} started")
    time.sleep(2)  # Simulates a long-running task
    print(f"Task {n} finished")
    return f"Result of task {n}"

# Using ThreadPoolExecutor
def execute_tasks():
    tasks = [1, 2, 3, 4, 5]  # List of tasks
    results = []

    # Create a thread pool with 3 simultaneous threads
    with ThreadPoolExecutor(max_workers=3) as executor:
        # Execute tasks in parallel
        results = executor.map(task, tasks)

    return list(results)

if __name__ == "__main__":
    results = execute_tasks()
    print("All results:", results)
Copier après la connexion

Résultat attendu

Lorsque vous exécutez ce code, vous verrez quelque chose comme ceci (dans un ordre quelque peu parallèle) :

Task 1 started
Task 2 started
Task 3 started
Task 1 finished
Task 4 started
Task 2 finished
Task 5 started
Task 3 finished
Task 4 finished
Task 5 finished
All results: ['Result of task 1', 'Result of task 2', 'Result of task 3', 'Result of task 4', 'Result of task 5']
Copier après la connexion

Les tâches 1, 2 et 3 démarrent simultanément car max_workers=3. D'autres tâches (4 et 5) attendent que les threads soient disponibles.


Quand l’utiliser ?

Cas d'utilisation typiques :

  • Récupération de données à partir des API : chargez plusieurs URL simultanément.
  • Traitement de fichiers : lire, écrire ou transformer plusieurs fichiers simultanément.
  • Automatisation des tâches : lancez plusieurs scripts ou commandes en parallèle.

Meilleures pratiques

  1. Limiter le nombre de fils de discussion :

    • Trop de threads peuvent surcharger votre processeur ou créer des goulots d'étranglement.
  2. Gérer les exceptions :

    • Si une tâche échoue, cela peut affecter l'ensemble du pool. Détectez les exceptions dans vos fonctions.
  3. Utilisez ProcessPoolExecutor pour les tâches liées au processeur :

    • Les threads ne sont pas optimaux pour les calculs lourds en raison du Global Interpreter Lock (GIL) de Python.

Exemple avancé : récupération d'URL en parallèle

Voici un exemple concret : récupérer plusieurs URL en parallèle.

import requests
from concurrent.futures import ThreadPoolExecutor

# Function to fetch a URL
def fetch_url(url):
    try:
        response = requests.get(url)
        return f"URL: {url}, Status: {response.status_code}"
    except Exception as e:
        return f"URL: {url}, Error: {e}"

# List of URLs to fetch
urls = [
    "https://example.com",
    "https://httpbin.org/get",
    "https://jsonplaceholder.typicode.com/posts",
    "https://invalid-url.com"
]

def fetch_all_urls(urls):
    with ThreadPoolExecutor(max_workers=4) as executor:
        results = executor.map(fetch_url, urls)
    return list(results)

if __name__ == "__main__":
    results = fetch_all_urls(urls)
    for result in results:
        print(result)

Copier après la connexion

Conclusion

ThreadPoolExecutor simplifie la gestion des threads en Python et est idéal pour accélérer les tâches liées aux E/S. Avec seulement quelques lignes de code, vous pouvez paralléliser les opérations et gagner un temps précieux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal