Python3.5 Windows10 64bit
Multiprocessingモジュールを用いたプログラムを書いています。
ユーザーからのコマンド入力をinput()で受け付けていますがMultiprocessingと相性が悪く不具合を起こします。
問題をわかりやすくしたコードを下記に書きました。
python
1from multiprocessing import Process 2import time 3 4 5def hello(message): 6 while True: 7 time.sleep(1) 8 print(message) 9 10 11def work(): 12 print("start") 13 Process(target=hello, args=('nice.',)).start() 14 while True: 15 w = input(">> ") 16 print(w) 17 18if __name__ == '__main__': 19 work()
上記のプログラムを実行すると下記のようにプロセスが遅れて実行されます。
入力しなければ永遠に止まったままです。
commandline
1start 2>> a 3a 4>> c 5c 6>> nice. 7nice. 8nice.
input()以外でユーザーから入力を受け付ける必要があります。
何か良い方法はありませんでしょうか?
追記
これは"input()があるとMultiprocessingが始まらない"というPython自体のバグだと思います。
以下のような出力を想定しています。入力が無くてもループが始まるのが想定です。Linuxだとこういう動きになりました。
commandline
1start 2>> nice. 3nice. 4nice. 5nice.
inoutのBlockingがMultiprocessingをBlockして始まりません。
入力すると始まるという事からそう予想しています。
このinputはDebugする為に使用しています、任意の関数をexecで実行させたり変数を表示させたりなど。この手段が使えないと不便ですので解決したいです。
input()で何が問題になっているかもう少し説明して見てもらえませんか。入力と出力が混ざってしまうことが問題?
追記しました、宜しくお願いします。
inputは標準入力を待っており、その後にサブプロセスを走らせるようにコードが書かれているので、言語のバグではないですね。プログラムは書かれた通りに動いています。お示しのログはサブプロセスの終了を待ってから次の入力を受け付けたいように見えますが(joinを使う場合に相当)
すみません、例が悪かったです。環境を書かなかったのも申し訳ありません。Processの場所を変更して追記しました。
inputのブロックで暗黙的にプロセスが切り替わるのを期待しているコードに見えますが。おまじないでよければ、time.sleep(1)をProcess#startした後に。
Sleep入れると想定通りの動きになりますね。うむむ....何が起きているのかよくわからない。