0

私はPython用のCementフレームワークに問題があります(現時点ではpython3を使用しています)。私は、PythonのPoolワーカーを使用するマルチプロセスアプリケーションを持っています。すべてのmultiporcessingセクションの終わり(それが結果に干渉しないDEOS)私の標準出力は、これらの例外の1以上で満たされている:セメントのフレームワークは、プールの作業者のクローズでシグナル15を受け取ります

Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/util.py", line 254, in _run_finalizers 
    finalizer() 
    File "/usr/lib/python3.5/multiprocessing/util.py", line 186, in __call__ 
    res = self._callback(*self._args, **self._kwargs) 
    File "/usr/lib/python3.5/multiprocessing/queues.py", line 198, in _finalize_join 
    thread.join() 
    File "/usr/lib/python3.5/threading.py", line 1054, in join 
    self._wait_for_tstate_lock() 
    File "/usr/lib/python3.5/threading.py", line 1070, in _wait_for_tstate_lock 
    elif lock.acquire(block, timeout): 
    File "/home/yogaub/.virtualenvs/seminar/lib/python3.5/site-packages/cement/core/foundation.py", line 123, in cement_signal_handler 
    raise exc.CaughtSignal(signum, frame) 
cement.core.exc.CaughtSignal: Caught signal 15 

これがなぜ起こるか誰もが知っていて、それを防ぐためにどのように?

おかげ

編集:私はthis questionのマルチロギングシステムにログインしてることを追加する必要があります。私は本当に相関があるかどうかはわかりません。

EDIT2:これは、プロセスプールの作成と終了です:

pool = Pool(processes=core_num) 
pool.map(worker_unpacker.work, formatted_input) 
pool.close() 
t2 = time.time() 

私はセメントのフックシステムとSIGTERMをキャッチしようとしましたが、それは動作しません。私が現時点で見つけた唯一の解決策は、実際にはセメントアプリの設定でシグナルを完全に無視することです(しかし、実際には私が好きな解決策ではありません)。

+0

シグナル15は 'SIGTERM'で、プロセスにkillシグナルを送ると、プロセスで' terminate() 'を実行していますか?プールをセットアップして実行し、それに '参加する 'プログラムの部分を共有できますか? – hansaplast

+0

@hansaplastありがとう、はい私はそれがsigtermだと理解した。私が実際には分かっていないのは、誰がそれを生成するのか、それがなぜセメントによって捕まえられないのかです(たとえ明白にフックをセットアップしても)。 – ClonedOne

答えて

0

これは、推測される推測です。親プロセスは、終了時に開始されたプロセスを強制終了します(terminate())。親プロセスでpool.join()を呼び出すと、親プロセスはすべてのサブプロセスが終了するまで待機し、SIGTERMを送信しません。

+0

ありがとう! 'pool.join()'への明示的な呼び出しはそのトリックを行いました。しかし、python docには 'close() 'というステートメントがあるので変です。 これ以上のタスクがプールに送信されないようにします。すべてのタスクが完了すると、ワーカープロセスは終了します。 ' それでも、セメントフックがそれを捕まえなかったことは少し気になります。 – ClonedOne

+0

はい、親プロセスが 'close()'を呼び出し、プロセスが関数を終了すると、正常終了します。あなたが持っていた問題は、親プロセスがあまりにも長い間待たずに済んでいたことです。それで、彼は労働者を殺して死に至らしめました。 'join()'は、詳細説明をしたい場合には、すべてのサブプロセスが完了するまで待つように親に説明します。詳しくは、 – hansaplast

+0

@ClonedOneを読んでください。 – hansaplast

関連する問題