J'ai trouvé que dans Python 3.4, il existe peu de bibliothèques différentes pour le multitraitement / 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 des multicores sur mon ordinateur. Mais je ne sais pas quelle bibliothèque je devrais apprendre.
python
multithreading
python-3.x
multiprocessing
python-asyncio
user3654650
la source
la source
Réponses:
Ils sont destinés à des fins et / ou exigences (légèrement) différentes. CPython (une implémentation Python principale typique) a toujours le verrou d'interpréteur global, donc une application multi-thread (un moyen standard d'implémenter le traitement parallèle de nos jours) est sous-optimale. C'est pourquoi
multiprocessing
on peut préférerthreading
. Mais tous les problèmes ne peuvent pas être efficacement divisés en parties [presque indépendantes], il peut donc être nécessaire de recourir à de lourdes communications interprocessus. C'est pourquoimultiprocessing
ne peut 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 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.la source
[Réponse rapide]
TL; DR
Faire le bon choix:
Référence
[ REMARQUE ]:
asyncio
boucle d'événement ultra rapide ( uvloop rendasyncio
2-4x plus rapide).[MISE À JOUR (2019)]:
la source
asyncio
quand vous utilisez des fonctions attendues, larequest
bibliothèque n'est pas une méthode attendue, au lieu de cela, vous pouvez utiliser comme laaiohttp
bibliothèque ou la requête asynchrone , etc.Voici l'idée de base:
Donc, tenez-vous-en au thread, sauf si vous avez des problèmes d'E / S / CPU.
la source
Dans le multitraitement, vous tirez parti de plusieurs processeurs pour distribuer vos calculs. Étant donné que chacun des processeurs fonctionne en parallèle, vous êtes effectivement en mesure d'exécuter plusieurs tâches simultanément. Vous souhaiterez utiliser le multitraitement pour les tâches liées au processeur . Un exemple serait d'essayer de calculer une somme de tous les éléments d'une énorme liste. Si votre machine a 8 cœurs, vous pouvez "couper" la liste en 8 listes plus petites et calculer la somme de chacune de ces listes séparément sur un noyau séparé, puis additionner simplement ces nombres. Vous obtiendrez une accélération d'environ 8x en faisant cela.
En filetagevous n'avez pas besoin de plusieurs processeurs. Imaginez un programme qui envoie de nombreuses requêtes HTTP sur le Web. Si vous utilisiez un programme à un seul thread, il arrêterait l'exécution (bloquer) à chaque demande, attendrait une réponse, puis continuerait une fois reçu une réponse. Le problème ici est que votre CPU ne fonctionne pas vraiment en attendant qu'un serveur externe fasse le travail; il aurait pu faire un travail utile entre-temps! Le correctif consiste à utiliser des threads - vous pouvez en créer beaucoup, chacun étant responsable de la demande de contenu sur le Web. La bonne chose à propos des threads est que, même s'ils fonctionnent sur un processeur, le processeur "gèle" de temps en temps l'exécution d'un thread et saute à l'exécution de l'autre (cela s'appelle la commutation de contexte et cela se produit constamment à non-déterministe. intervalles). - utilisez le filetage.
asyncio est essentiellement un threading où pas le CPU mais vous, en tant que programmeur (ou en fait votre application), décidez où et quand le changement de contexte se produit . En Python, vous utilisez un
await
mot-clé pour suspendre l'exécution de votre coroutine (défini à l'aide duasync
mot-clé).la source