How to Use ThreadPoolExecutor.submit() in Python
Exécute des fonctions en parallèle avec ThreadPoolExecutor.submit(), récupère les résultats avec future.result(), et traite plusieurs tâches simultanément en Python standard.
Python code
18 linesfrom concurrent.futures import ThreadPoolExecutor
import time
def square(n):
time.sleep(0.1) # Simulate work
return n * n
if __name__ == "__main__":
with ThreadPoolExecutor(max_workers=3) as executor:
future = executor.submit(square, 5)
result = future.result()
print(f"Result: {result}")
# Submit multiple tasks and collect results
with ThreadPoolExecutor(max_workers=2) as executor:
futures = [executor.submit(square, i) for i in range(1, 6)]
results = [f.result() for f in futures]
print(f"Results: {results}")
Output
Result: 25
Results: [1, 4, 9, 16, 25]
How it works
La méthode submit envoie une fonction et ses arguments à un file d'attente de tâches gérée par le ThreadPoolExecutor. Elle retourne immédiatement un objet Future qui vous permet de suivre l'exécution asynchrone. L'appel à future.result() bloque jusqu'à ce que la tâche soit terminée et retourne sa valeur de retour. En utilisant with, le pool de threads est automatiquement fermé après le bloc, garantissant la libération des ressources. Soumettre plusieurs tâches et appeler result() sur chaque futur dans l'ordre de soumission permet de collecter les résultats dans l'ordre d'origine.
Common mistakes
- Oublier d'appeler `.result()` sur le Future, ce qui fait que l'exception levée dans la fonction reste invisible.
- Utiliser `executor.map` pour des tâches indépendantes avec des arguments complexes, alors que `submit` permet plus de flexibilité.
- Créer un nouveau pool pour chaque tâche au lieu de le réutiliser, ce qui gaspille des ressources.
Variations
- Utilisez `executor.map()` pour une boucle simple sur une séquence d'arguments et obtenir les résultats dans l'ordre.
- Utilisez `as_completed()` pour traiter les résultats dès qu'ils sont disponibles, sans attendre les plus lents.
Real-world use cases
- Télécharger plusieurs fichiers ou pages web en parallèle et agréger les réponses.
- Effectuer des requêtes HTTP concurrentes à une API pour réduire la latence globale.
- Traiter un lot d'images (redimensionnement, filtres) sur un serveur avec des threads.
Sponsored
More from Concurrency & performance
- Benchmark list.append vs deque.append in Python medium
- Build a Python Performance Profiler That Generates Readable Reports medium
- Graceful Shutdown Executor Context Manager in Python medium
- How to Build a Producer-Consumer Pattern with asyncio.Queue in Python medium
- How to Cancel an asyncio Task with Graceful Cleanup in Python medium
- How to Convert Data in Parallel with ThreadPoolExecutor in Python easy
Keep learning
Related tutorials and quizzes for this topic.