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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

1回答

1561閲覧

python2でmultiprocessing中にエラーが発生すると応答が帰ってこなくなる。

katosei

総合スコア32

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/06/10 03:26

概要

python2でmultiprocessing中にエラーが発生すると応答が帰ってこなくなる。

この原因と解決法が知りたいです。

環境

OS: CentOS7
言語:python2.7

やりたかった事

特定のコマンドを並列で実行し、結果を取得。

ソース

python

1#!/bin/env python 2 3import subprocess 4from multiprocessing import Pool 5 6def testSP (cmd): 7 print(cmd) 8 try: 9 ret=subprocess.check_output(cmd) 10 return {"rc":0,"stdout":ret} 11 except subprocess.CalledProcessError as e: 12 print("catch CalledProcessError") 13 print(e) 14 return {"rc":1,"stdout":e} 15 except: 16 return {"rc":255,"stdout":"-"} 17######################## 18 19print("==true==================") 20print(testSP("true")) 21 22print("==false==================") 23print(testSP("false")) 24 25print("==subprocess==================") 26p = Pool(2) 27ret=p.map(testSP,["true","false"]) 28print(ret)

実行結果

# ./test.py ==true================== true {'stdout': '', 'rc': 0} ==false================== false catch CalledProcessError Command 'false' returned non-zero exit status 1 {'stdout': CalledProcessError(), 'rc': 1} ==subprocess================== true false catch CalledProcessError Command 'false' returned non-zero exit status 1 Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner self.run() File "/usr/lib64/python2.7/threading.py", line 764, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib64/python2.7/multiprocessing/pool.py", line 376, in _handle_results task = get() TypeError: ('__init__() takes at least 3 arguments (1 given)', <class 'subprocess.CalledProcessError'>, ()) 以降応答なし、ctrl+cを押しても下記エラーが出てプロンプトは戻らない ●"ctrl+c"を押下● Process PoolWorker-2: Traceback (most recent call last): File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run self._target(*self._args, **self._kwargs) File "/usr/lib64/python2.7/multiprocessing/pool.py", line 102, in worker task = get() File "/usr/lib64/python2.7/multiprocessing/queues.py", line 374, in get racquire() KeyboardInterrupt

以上、よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

Poolの中で実行している処理にKeyboardInterruptの入力が伝達されずに、wait関数がいつまでも待ち続けている状態になることに起因すると思われます。

ret=p.map(testSP,["true","false"])

ret=p.map_async(testSP,["true","false"]).get(9999999)

に変更して、タイムアウトの設定をしてみてはどうでしょうか。

投稿2020/06/10 05:32

Mashiro

総合スコア654

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

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

katosei

2020/06/12 01:56

ありがとうございます。 反応遅くなってすみません。 そもそもCtrl+Cを押す前に、応答が帰ってこなくなる理由ってわかりますでしょうか? なぜmultiprocessingがエラーになるのかわからなくて。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問