水泥框架在池工作人员关闭时收到信号 15

Cement framework receive signal 15 on pool worker close

我遇到了 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()

我试过用 Cement 的钩子系统捕获 sigterm,但它不起作用。我目前找到的唯一解决方案是实际上完全忽略水泥应用程序配置中的信号(但这并不是我真正喜欢的解决方案..)。

这是一个有根据的猜测:父进程在退出时杀死(terminate()s)已启动的进程。如果在父进程中调用pool.join(),那么父进程会一直等到所有的子进程都执行完,不会再给子进程发送SIGTERM