multiprocess python 処理がスタートしていないように見える。それはなぜでしょうか。
マルチプロセスをやってみようと思い、あるサイトから引っ張って来たマルチプロセスのコードです。それを私がいくつかprint文を増加させたり、global
宣言化して、いろいろ挙動を調査して改編してみたものです。
実行してみると、すんなりと実行できたのですが、関数の中にprint
文を入れて確かめてみると、どうやら関数が全く実行されていない・・・。
文法としてはこれで間違っていないように思うのですが、どこに問題があるのでしょうか?
関数の中身が変な計算になっているのかと思いましたが、関数自体が実行されていないようなのです。タスクマネージャを見ると、確かにプロセス処理が一時的に増加し、すぐに減少するため、マルチプロセス自体は発生しているように見えます。
関数を実行するのかと思いきや、関数は全く実行されていないように思うのですが、これはどうしてなのでしょうか?別プロセスに入れられているからだと思ったのですが、最終的にnの値を確かめてみても、初期値から変化していないように思います。
これが正常なマルチプロセスの挙動なのでしょうか?まだ初めての事で、どんなものなのかがわかりません。Python公式サイトや、本家SOのQ&Aでは、こうかけと言われているようになっていると思うのですが・・・。
python3 multiprocess 処理が並行に動いてくれません。
上記質問の回答でnekketsuuさんが提示してくださったサンプルコードも同じ反応だったので、マルチプロセス自体の理解を私が十分に出来ていないものなのだと思います。(多分コンピューターの動作自体の理解が不十分?)
これを確かめようと思った動機は、自作アプリのコードにマルチプロセスを取り入れようと思ったところ、Start!Finish!とほぼ同時に打たれてしまい、画面は真っ白だし、空回り感が激しかったので、いきなり大きなプログラムに入れたせいでどっか間違えているんだろうと思っていましたが、こちらも関数内の処理にはいって行っているように思えないため、驚きました。(中身は結構大きなfor
ループを回しているので、もっと時間のかかる処理を期待していたのです。)
質問
マルチプロセスをするのはいいのですが、この関数の中身が実行されているように見えないのですが、どういうことなのでしょうか?普通にグローバルスコープに属するのですが、グローバル宣言までしています。n
をとっても、n
は関数外でも値をかえていないように思うのですが、これはどうしてなのでしょうか?(別プロセスで処理したから?)そうすると、結果としてどのような計算を関数内で行ったとしても、その結果を使う事ができないので、絵に描いた餅のように思ってしまいます。
追記:
OOPerさんのご指摘を受けましたので、自分なりに書いてみます。
実行環境
Windows-10 64bit Intel(R) Celeron(R) CPU G530 @2.40GHz 2.40GHz
Anaconda3 python 3.6.3
ソースファイルは、アナコンダにモジュールファイルをいつも通り作って、そしてそれを実行ボタンで実行したものです。シェルとかそういった難し気なことをしたことはないです。ひょっとして、USBメモリから実行していることは影響しているでしょうか?py
ファイルはUSBメモリ内のコードです。
コード
from multiprocessing import Process
import time
def countDown(n):
print("来ました",n)
while n > 0:
n -= 1
n = int(1e9)
global n1,n2,n3,n4
n1, n2, n3, n4 = int(n/4), int(n/4), int(n/4), int(n/4)
print(n1,n2,n3,n4)
jobs = [
Process(target=countDown, args=(n1,)),
Process(target=countDown, args=(n2,)),
Process(target=countDown, args=(n3,)),
Process(target=countDown, args=(n4,)),
]
start_time = time.time()
for j in jobs:
j.start()
for j in jobs:
j.join()
finish_time = time.time()
print(finish_time - start_time)
print(n1,n2,n3,n4)
実行結果
250000000 250000000 250000000 250000000
0.7248373031616211
250000000 250000000 250000000 250000000