水泥框架收到关于池工人关闭

时间:2017-02-03 21:28:29

标签: python exception multiprocessing signals python-multiprocessing

我遇到了python的Cement框架问题(目前使用python3)。我有一个使用python的Pool worker的多进程应用程序。每个多次进动部分的结尾(它不会干扰结果)我的标准输出中有一个或多个例外:

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,但它不起作用。我目前发现的唯一解决方案是实际上完全忽略水泥应用程序配置中的信号(但它实际上并不是我喜欢的解决方案......)。

1 个答案:

答案 0 :(得分:0)

这是一个有根据的猜测:父进程在退出时终止(terminate() s)已启动的进程。如果您在父进程中调用pool.join(),则父进程将等待,直到所有子进程完成,并且不会向它们发送SIGTERM