質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2531閲覧

multiproccesingで呼び出した関数内のprintが上手く動かない

tride

総合スコア68

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/29 00:58

編集2018/11/29 22:41

以下参考サイトを参考に、multiproccesingのサンプルプログラムを稼働させたところ、実行1回目は正常に動作したにもかかわらず、どういう訳か幾度目からか正常に動作しなくなりました。
プログラムの内容はサイトの内容とほぼ同じで、違いはtimeをimportしているぐらいです。

Spyderにあるブレークポイントを付けてプログラムを順次追ってみた所、def f1(name):部分からif name == "main":に飛んでいき、そのまま関数内を一切通過せずにp.joinまでプログラムが実行されている様でした。

尚、環境については3ヵ月ほど前に構築してから使用しているもので、新規構成ではありません。

<試したこと>

  • Spyderの再起動
  • PCの再起動
  • カーネルの再起動
  • Jupyter Notebook及びIDLEで実行しても状況は変わらず。
  • sleepを外した場合は一時停止(3秒ほど)がなくなってすぐさまProcess joined. と表示されます。

参考サイト:https://www.yoheim.net/blog.php?q=20170601
環境:WinPython
Ver:Python3.6.6amd64
IDE:Spyder

python

1from multiprocessing import Process 2import time 3 4# 呼び出したい関数 5def f1(name): 6 print("Hello" + name) 7 print("Sleeping... 3s") 8 time.sleep(3) 9 print("Good morning" + name) 10 11if __name__ == "__main__": 12 # サブプロセスを作成します 13 14 p = Process(target=f1, args=("Bob",)) 15 # 開始します 16 p.start() 17 print("Process started.") 18 # サブプロセス終了まで待ちます 19 p.join() 20 print("Process joined.") 21

実行結果>
Process started.
<3秒ほど一時停止>
Process joined.

理想>
Process started.
Hello Bob
Sleeping... 3s
Good morning Bob
Process joined.

追記>

  • python.exeで実行した結果

以下のエラーが出たので、調べてみた所、以下サイト(英語)などの様に似た内容で引っかかっている人がいる様でしたが、今一内容が理解できない為、少し調べます。
https://stackoverflow.com/questions/41385708/multiprocessing-example-giving-attributeerror

Process started.
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\WinPy\python-3.6.6.amd64\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "C:\WinPy\python-3.6.6.amd64\lib\multiprocessing\spawn.py", line 115, in _main
self = reduction.pickle.load(from_parent)
AttributeError: Can't get attribute 'f1' on <module 'main' (built-in)>
Process joined.

追記>
コマンドプロンプトからpythonコマンドで当該サンプルファイルを動かした所、理想通りに動きました。
上記はpython.exe上でサンプルプログラムをコピペして動かした結果でしたので、それで動かなかったのかもしれません。
ただ、そうなるとIDEで動かなかったのがなぜなのか分からず仕舞いです。

追記>
IDEのSpyderに関して、以下サイトではmultiproccesingはiPythonでは動かないとありました。
以下対応をすると、コマンドプロンプトが新たに開かれて実行できることが確認されました。
ただ、そうなると当該プログラムが最初Spyder上で動いたのが謎です。
これ以外にIDEを使っていないので他のIDEと勘違いした事や、コマンドプロンプトから動かす事などないのに・・・。

とりあえず、もう少し調べてみたいと思います。

サイト>https://qiita.com/fiftystorm36/items/26c021c0694aa5d72bed

対応>
実行 -> ファイルごとの設定 -> 外部システムターミナルにチェック

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2018/11/29 04:07

Spyder上でなく実行したらどうなりますか?またsleepを外すとどうなりますか?
tride

2018/11/29 11:44

Jupyter Notebook及びIDLEで実行しても状況は変わらずでした。また、sleepを外した場合は一時停止(3秒ほど)がなくなってすぐさまProcess joined. と表示されます。
wwbQzhMkhhgEmhU

2018/11/29 13:49

ここに書かずに質問の方を変更・追加してください。また、winpyというのはwinpythonですか?winpyではIDEでなく端末実行はできないのでしょうか?
tride

2018/11/29 15:11

失礼しました。winpyは誤記で、正しくはWinPythonです。また先回答の内容も反映させて頂きました。
wwbQzhMkhhgEmhU

2018/11/29 15:59

さっきも聞きましたが、WinPythonではIDEではなくコマンドプロンプトからpythonインタプリタを直接叩くことができないのでしょうか?
tride

2018/11/29 17:29

IDLEがそれだと思っていました。python.exeで実行した内容を追記致しました。
wwbQzhMkhhgEmhU

2018/11/29 22:20

エラーが出たんですね。私の方でも軽く追ってみます。またWindows7 32bitにWinPython3.6.6.2を入れて、上のソースをtest.pyで保存し、WinPython Command Prompt.exeから、python test.pyとして実行したのですが、理想の結果となり、再現しませんでした。
guest

回答1

0

自己解決

結局動いた原因は分からず仕舞いでしたが、正常動作ではないという事で以下対応で完了します。

サイト>https://qiita.com/fiftystorm36/items/26c021c0694aa5d72bed

対応>
実行 -> ファイルごとの設定 -> 外部システムターミナルにチェック

投稿2018/12/24 10:37

tride

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問