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