0

我遇到了python水泥框架問題(此時使用python3)。我有一個使用python的Pool worker的多進程應用程序。每multiporcessing部分我stdout中充滿了一個或一個以上這些異常的結束(它不DEOS影響測試結果的):水泥框架接收池員關閉信號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。我並不真正知道的是誰生成它,爲什麼它不被Cement所捕獲(即使我明確地設置鉤子)。 – ClonedOne

回答

0

這是一個有教養的猜測:父進程殺死(terminate() s)退出時啓動的進程。如果在父進程中調用pool.join(),則父進程將等待,直到所有子進程完成,並且不會將SIGTERM發送給它們。

+0

謝謝!對'pool.join()'的顯式調用完成了訣竅。這很奇怪,但是由於python doc指出'close() 阻止任何更多的任務被提交到池中。一旦所有任務完成,工作人員的流程將退出。' 水泥吊鉤沒有抓住它,但它還是讓我困惑不解。 – ClonedOne

+0

是的,當父進程調用'close()'並且一個進程完成該函數時,它會正常退出。你所遇到的問題是,父母的過程沒有等待那麼久,在工人完成之前它已經退出了。所以說,他把工人和他一起殺死。 'join()'顯式告訴父級等待,直到所有的子進程完成之後退出 – hansaplast

+0

@ClonedOne如果你想要更多的解釋,請這麼說,我盡我所能:-) – hansaplast