私のコードは簡単に並列化できると思うので、最近、マルチプロセッシングについて詳しく調べ始めました。ただし、チュートリアルを進めていると、プールに分散された関数が印刷されないように見えるという問題が発生しました。
ここに犯人があります:
__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()
私が受け取る出力は次のとおりです。
main line
module name: __main__
parent process: 10812
process id: 11348*
これで、コンソールがinfo関数のみを出力し、f関数(multiprocessing.Processを使用している)の出力は出力しないように見えることは明らかです。オンラインで見つけた他の例でも同様の問題が発生しました。マルチプロセッシングを使用すると計算が正しく行われて返されますが、コンソールに印刷が表示されません。
なぜ誰かが、この問題に対処する方法を知っていますか?
関連する可能性のあるメモで、私はPython 3.6 in Spyder 3.2.4を使用しています。Spyderにはいくつかの癖があるようです。コードの最初の行はすでにマルチプロセッシングを可能にするために必要な回避策であるためですまったく動作しますが、私がすでに議論した問題 ここ 。同様の未解決の問題が言及されました ここ 。
皆様のお力添えとあけましておめでとうございます。
(Spyderメンテナはこちら)SpyderのIPythonコンソールのWindowsでは、マルチプロセッシングがうまく機能しません。ただし、コードを外部ターミナルで実行して、必要な結果を得ることができます。
そのためには、
Run > Configuration per file > Execute in an external system terminal
代わりにログファイルを使用できます。 fp.write()の使用