J'ai trouvé que dans Python 3.4 il y a peu de bibliothèques différentes pour le multiprocessing/threading: multiprocessing vs threading vs asyncio =.
Mais je ne sais pas lequel utiliser ou est le "recommandé". Font-ils la même chose ou sont-ils différents? Si oui, lequel est utilisé pour quoi? Je veux écrire un programme qui utilise le multicœur sur mon ordinateur. Mais je ne sais pas quelle bibliothèque je dois apprendre.
Ils sont destinés à des fins et/ou exigences (légèrement) différentes. CPython (une ligne principale typique Python) a toujours le verrou interprète global donc une application multi-thread (une façon standard d'implémenter le traitement parallèle de nos jours) est sous-optimale). C'est pourquoi multiprocessing
peut être préféré à threading
. Mais tous les problèmes ne peuvent pas être effectivement divisés en [presque indépendants] Il peut donc y avoir un besoin dans les communications interprocessus lourdes. C'est pourquoi multiprocessing
peut ne pas être préféré à threading
en général.
asyncio
(cette technique est disponible non seulement en Python, d'autres langages et/ou frameworks l'ont également, par exemple Boost.ASIO ) est une méthode pour gérer efficacement un grand nombre d'E/S opérations à partir de nombreuses sources simultanées sans besoin d'exécution de code parallèle. C'est donc juste une solution (une bonne en effet!) Pour une tâche particulière, pas pour le traitement parallèle en général.
Nous avons parcouru les formes de concurrence les plus populaires. Mais la question demeure - quand choisir lequel? Cela dépend vraiment des cas d'utilisation. D'après mon expérience (et ma lecture), j'ai tendance à suivre ce pseudo code:
if io_bound:
if io_very_slow:
print("Use Asyncio")
else:
print("Use Threads")
else:
print("Multi Processing")
- CPU Bound => Multi Processing
- Liées E/S, E/S rapides, nombre limité de connexions => Multi-threading
- E/S liées, E/S lentes, nombreuses connexions => Asyncio
[ [~ # ~] note [~ # ~] ]:
asyncio
boucle d'événements ( vloop rend asyncio
2-4x plus rapide).