web-dev-qa-db-fra.com

Pas de sorties d'impression multitraitement (Spyder)

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.

13
J.Galt

(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

16
Carlos Cordoba

vous pouvez utiliser le fichier journal à la place. en utilisant fp.write ()