相关疑难解决方法(0)

为什么在SIGTERM中使用threading.Event结果没被捕获?

我有一个线程化的Python守护进程.像任何好的守护进程一样,它想要启动它的所有工作线程,然后等待它被告知终止.终止的正常信号是SIGTERM,并且在大多数语言中我都会通过等待事件或互斥来终止,所以threading.Event对我来说是有意义的.问题是Python的Event对象和Unix信号似乎没有很好地结合在一起.

这按预期工作,终止于SIGTERM:

import signal
import time

RUN = True

def handle(a, b):
    global RUN
    print "handled"
    RUN = False

signal.signal(signal.SIGTERM, handle)
while RUN:
    time.sleep(0.250)
print "Stopping"
Run Code Online (Sandbox Code Playgroud)

但这导致没有SIGTERM交付(即,除了戒烟,"处理"永远不会被打印):

import signal
import threading

RUN_EVENT = threading.Event()

def handle(a, b):
    print "handled"
    RUN_EVENT.set()

signal.signal(signal.SIGTERM, handle)
RUN_EVENT.wait()
print "Stopping"
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. threading.Event在某种程度上滥用了吗?
  2. 如果我不是,除了第一个例子中的poll-and-sleep机制之外还有其他选择吗?
  3. 另外,如果我不是,为什么使用threading.Event杀死信号处理程序?

python events multithreading signals daemon

16
推荐指数
1
解决办法
2568
查看次数

标签 统计

daemon ×1

events ×1

multithreading ×1

python ×1

signals ×1