私は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をキャッチしようとしましたが、それは動作しません。私が現時点で見つけた唯一の解決策は、実際にはセメントアプリの設定でシグナルを完全に無視することです(しかし、実際には私が好きな解決策ではありません)。
シグナル15は 'SIGTERM'で、プロセスにkillシグナルを送ると、プロセスで' terminate() 'を実行していますか?プールをセットアップして実行し、それに '参加する 'プログラムの部分を共有できますか? – hansaplast
@hansaplastありがとう、はい私はそれがsigtermだと理解した。私が実際には分かっていないのは、誰がそれを生成するのか、それがなぜセメントによって捕まえられないのかです(たとえ明白にフックをセットアップしても)。 – ClonedOne