Le parallélisme en Python
quelles sont les options pour réaliser le parallélisme en Python? Je veux effectuer un tas de CPU des calculs sur de très grandes trames, et tiens à paralléliser. Venant d'un contexte en C, je connais trois approches au parallélisme:
- processus de transmission de messages, éventuellement distribués à travers un cluster, par exemple MPI.
- parallélisme explicite de la mémoire partagée, en utilisant pthreads ou fork (), pipe (), et. al
- parallélisme implicite de mémoire partagée, en utilisant OpenMP.
décider d'une approche d'utilisation est un exercice de compromis.
En Python, quelles sont les méthodes disponibles et quelles sont leurs caractéristiques? Est-il un pouvant être mis en cluster MPI clone? Quels sont les moyens privilégiés pour réaliser le parallélisme de la mémoire partagée? J'ai entendu parler de problèmes avec la GIL, ainsi que des références à tasklets.
En bref, que dois-je savoir sur les différentes stratégies de parallélisation en Python avant de choisir entre eux?
5 réponses
généralement, vous décrivez un calcul lié au CPU. Ce N'est pas le fort de Python. Ni, historiquement, est le multitraitement.
Threading dans l'interpréteur Python mainstream a été gouverné par une redoutable serrure globale. La nouvelle multitraitement API fonctionne autour de cela et donne une abstraction de pool de travail avec des pipes et des files d'attente et autres.
vous pouvez écrire votre code critique en C ou Cython, et utiliser Python pour colle.
La nouvelle (2.6) multitraitement module est le chemin à parcourir. Il utilise des sous-processus, ce qui permet de contourner le GIL problème. Il élimine également certaines des questions locales / distantes, de sorte que le choix d'exécuter votre code localement ou réparti sur un cluster peut être fait plus tard. La documentation que j'ai reliée ci-dessus est assez peu à mâcher, mais devrait fournir une bonne base pour commencer.
il y a beaucoup de paquets pour faire cela, le plus approprié comme l'autre dit est le multiprocessing, spécialement avec la classe "Pool".
Un résultat similaire peut être obtenu par Python parallèle, qui en plus est conçu pour fonctionner avec des clusters.
en tout cas, je dirais d'aller avec le multiprocessing.
selon la quantité de données que vous devez traiter et le nombre de CPU / machines que vous avez l'intention d'utiliser, il est parfois préférable d'en écrire une partie en C (ou Java/C# si vous voulez utiliser jython / IronPython)
l'accélération que vous pouvez obtenir à partir de cela pourrait faire plus pour votre performance que l'exécution des choses en parallèle sur 8 CPUs.