J'ai récemment commencé à me plonger dans le multitraitement, car je pense que mon code peut être facilement parallélisé. Cependant, en travaillant sur les tutoriels, j'ai rencontré un problème: les fonctions distribuées dans un pool ne semblent pas s'imprimer.
Voici le coupable:
__spec__ = None # This line is required for Spyder and not part of the actual example
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
La sortie que je reçois est la suivante:
main line
module name: __main__
parent process: 10812
process id: 11348*
Maintenant, il est clair que la console ne semble imprimer que la fonction info, mais pas n'importe quelle sortie de la fonction f (qui utilise le multiprocessing.Process). J'ai rencontré des problèmes similaires avec d'autres exemples que j'ai trouvés en ligne: les calculs sont effectués et retournés correctement lors de l'utilisation du multitraitement, mais les impressions ne s'affichent jamais dans la console.
Quelqu'un sait-il pourquoi et comment résoudre ce problème?
Sur une note peut-être liée, j'utilise Python 3.6 dans Spyder 3.2.4. Spyder semble avoir quelques bizarreries, car la première ligne du code est déjà une solution de contournement requise pour autoriser le multitraitement à travailler du tout, un problème que j'ai trouvé déjà discuté ici . Un problème similaire et non résolu a été mentionné ici .
J'apprécierais toute aide et bonne année à tout le monde.
(ici le responsable Spyder) Le multiprocessing ne fonctionne pas bien sur Windows dans la console IPython de Spyder. Cependant, vous pouvez exécuter votre code dans un terminal externe pour obtenir les résultats souhaités.
Pour ce faire, rendez-vous sur
Run > Configuration per file > Execute in an external system terminal
vous pouvez utiliser le fichier journal à la place. en utilisant fp.write ()