web-dev-qa-db-fra.com

multiprocessing vs multithreading vs asyncio dans Python 3.4

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.

59
user3654650

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.

48
user3159253

[Réponse rapide]

TL; DR


Faire le bon choix:

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

Référence


[ [~ # ~] note [~ # ~] ]:

  • Si vous avez une méthode d'appel longue (c'est-à-dire une méthode contenant un temps de veille ou des E/S paresseuses), le meilleur choix est asyncio , Twisted ou Tornado approche (méthodes coroutine), qui fonctionne avec un seul thread comme simultanéité.
  • asyncio fonctionne sur Python3.4 et versions ultérieures.
  • Tornado et Twisted sont prêts puisque Python2.7
  • vloop est ultra rapide asyncio boucle d'événements ( vloop rend asyncio 2-4x plus rapide).
31
Benyamin Jafari