J'ai implémenté un parallélisme simple dans un code Monte Carlo en utilisant le module de multi-traitement Python. J'ai un code qui ressemble à:
montecarlos = [MonteCarlo(f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [mc.results for mc in montecarlos]
Cependant, quand je regarde la liste des résultats, il semble que les itérateurs de monte carlo n'aient même pas commencé. Je sais qu'ils l'ont fait, car je peux demander aux processus d'imprimer des informations pendant les étapes de Monte Carlo. Je fais donc quelque chose de stupide. J'avais pensé que le job.join () empêcherait la construction de la liste des résultats jusqu'à ce que tout se soit déroulé, et donc le champ mc.results serait mis à jour.
Je me rends compte que je ne vous ai pas donné les détails de ma routine de monte carlo, et j'espère que cela n'a pas d'importance, et que l'erreur que je fais est dans mon interprétation de ce que fait le multitraitement. Merci d'avance pour toute aide que vous pouvez offrir.
Les objets MonteCarlo
ont été décapés et envoyés aux processus enfants pour être exécutés - les .results
l'attribut dans ce processus n'est pas rempli car le mc
local n'a jamais été exécuté.
Si vous créez un multiprocessing.Queue
, vous pouvez le passer dans chaque travail MonteCarlo
, et une fois terminé, il devrait y mettre le résultat. Ensuite, le niveau supérieur peut attendre les valeurs de la file d'attente. (Sous le capot, cela décapera et décrochera l'objet résultant.)
result_queue = multiprocessing.Queue()
montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [result_queue.get() for mc in montecarlos]