C'est probablement une question triviale, mais comment paralléliser la boucle suivante en python?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Je sais comment démarrer des threads uniques en Python mais je ne sais pas comment "collecter" les résultats.
Plusieurs processus seraient également très bien - ce qui est le plus simple dans ce cas. J'utilise actuellement Linux, mais le code devrait également fonctionner sur Windows et Mac.
Quelle est la façon la plus simple de paralléliser ce code?
la source
calc_stuff
?multiprocessing
module pour des exemples plus complets.Pool.map()
fonctionne essentiellement commemap()
, mais en parallèle.Pour paralléliser une boucle for simple, joblib apporte beaucoup de valeur à l'utilisation brute du multitraitement. Non seulement la syntaxe courte, mais aussi des choses comme le regroupement transparent des itérations lorsqu'elles sont très rapides (pour supprimer la surcharge) ou la capture du traçage du processus enfant, pour avoir un meilleur rapport d'erreurs.
Avertissement: je suis l'auteur original de joblib.
la source
J'aime beaucoup
concurrent.futures
pour cela, disponible en Python3 depuis la version 3.2 - et via backport vers 2.6 et 2.7 sur PyPi .Vous pouvez utiliser des threads ou des processus et utiliser exactement la même interface.
Multiprocessing
Mettez ceci dans un fichier - futuretest.py:
Et voici la sortie:
Multithreading
Maintenant , changez
ProcessPoolExecutor
àThreadPoolExecutor
, et exécutez à nouveau le module:Vous avez maintenant effectué à la fois le multithreading et le multitraitement!
Remarque sur les performances et l'utilisation des deux ensemble.
L'échantillonnage est beaucoup trop petit pour comparer les résultats.
Cependant, je soupçonne que le multithreading sera plus rapide que le multitraitement en général, en particulier sous Windows, car Windows ne prend pas en charge le forking, donc chaque nouveau processus doit prendre du temps pour se lancer. Sur Linux ou Mac, ils seront probablement plus proches.
Vous pouvez imbriquer plusieurs threads dans plusieurs processus, mais il est recommandé de ne pas utiliser plusieurs threads pour dériver plusieurs processus.
la source
Ce qui précède fonctionne à merveille sur ma machine (Ubuntu, le paquet joblib a été préinstallé, mais peut être installé via
pip install joblib
).Tiré de https://blog.dominodatalab.com/simple-parallelization/
la source
L'utilisation de Ray présente plusieurs avantages :
Dans votre cas, vous pouvez démarrer Ray et définir une fonction à distance
puis l'invoquer en parallèle
Pour exécuter le même exemple sur un cluster, la seule ligne qui changerait serait l'appel à ray.init (). La documentation pertinente peut être trouvée ici .
Notez que j'aide à développer Ray.
la source
C'est la façon la plus simple de le faire!
Vous pouvez utiliser asyncio . (La documentation peut être trouvée ici ). Il est utilisé comme base pour plusieurs cadres asynchrones Python qui fournissent des serveurs réseau et Web hautes performances, des bibliothèques de connexion à la base de données, des files d'attente de tâches distribuées, etc. .
Maintenant, cette fonction sera exécutée en parallèle à chaque appel sans mettre le programme principal en état d'attente. Vous pouvez également l'utiliser pour paralléliser la boucle. Lorsqu'il est appelé pour une boucle for, bien que la boucle soit séquentielle, mais chaque itération s'exécute en parallèle avec le programme principal dès que l'interpréteur y arrive. Par exemple:
Cela produit la sortie suivante:
la source
wrapped()
et qu'elle devrait être**kwargs
au lieu de*kwargs
pourquoi n'utilisez-vous pas de threads et un mutex pour protéger une liste globale?
gardez à l'esprit, vous serez aussi rapide que votre fil le plus lent
la source
J'ai trouvé
joblib
est très utile avec moi. Veuillez voir l'exemple suivant:n_jobs = -1: utiliser tous les cœurs disponibles
la source
joblib
.Disons que nous avons une fonction asynchrone
Cela doit être exécuté sur un grand tableau. Certains attributs sont transmis au programme et certains sont utilisés à partir de la propriété de l'élément de dictionnaire dans le tableau.
la source
Jetez un oeil à ceci;
http://docs.python.org/library/queue.html
Ce n'est peut-être pas la bonne façon de le faire, mais je ferais quelque chose comme;
Code réel;
J'espère que cela pourra aider.
la source
Cela pourrait être utile lors de l'implémentation du multitraitement et de l'informatique parallèle / distribuée en Python.
Tutoriel YouTube sur l'utilisation du package Techila
Techila est un middleware informatique distribué, qui s'intègre directement à Python à l'aide du package techila. La fonction pêche dans le package peut être utile pour paralléliser des structures de boucles. (L'extrait de code suivant provient des forums de la communauté Techila )
la source
merci @iuryxavier
la source
exemple très simple de traitement parallèle est
la source