multitraitement vs multithreading vs asyncio en Python 3.4

J'ai trouvé que dans Python 3.4 il y a quelques différentes bibliothèques de multitraitement/filetage: multitraitement vs filetage 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 multicores dans mon ordinateur. Mais je ne sais pas quelle bibliothèque je devrais apprendre.

37
demandé sur Benyamin Jafari 2014-12-12 04:03:57

2 réponses

Ils sont destinés à des fins et/ou des exigences (légèrement) différentes. CPython (une implémentation Python typique en ligne principale) a toujours le verrou d'interpréteur global , donc une application multithread (une manière standard d'implémenter le traitement parallèle de nos jours) est sous-optimale. C'est pourquoi multiprocessing peut - préférence sur threading. Mais tous les problèmes ne peuvent pas être efficacement divisés en morceaux [presque indépendants], donc il peut y avoir un besoin de 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'opérations d'E/S à partir de nombreuses sources simultanées sans avoir besoin d'exécution de code parallèle. Donc c'est juste une solution (une bonne en effet!) pour une tâche particulière, pas pour le traitement parallèle en général.

35
répondu user3159253 2015-03-04 13:29:01

[Réponse Rapide]

TL; DR:


Faire le bon choix:

Nous avons parcouru les formes de concurrence les plus populaires. Mais la question reste - quand choisir lequel? Cela dépend vraiment du 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 lié = > multi traitement
  • E / S liées, E / S rapides, nombre limité de connexions = > multi Threading
  • E / S Lié, E / S lentes, nombreuses connexions = > Asyncio

Référence

1
répondu Benyamin Jafari 2018-09-29 07:54:27