信号处理程序在 python 中不工作
signal handler not working in python
我正在 Raspberry Pi 上编写一个异步视频播放程序。我需要在子进程中 运行 omxplayer 并在主进程中接收输入。当接收到一些输入时,主进程会将信号发送给子进程。
这是我的代码:
def worker():
p = subprocess.Popen(['omxplayer', '1.mov'], stdin = subprocess.PIPE)
def handler(signum, frame):
print p.pid
p.stdin.write('q') # keystroke of 'q' will quit omxplayer FYI
signal.signal(signal.SIGUSR1, handler) # can only be trigger in code
到目前为止看起来还不错。我可以 运行 worker() 并在代码片段中发送 SIGUSR1,它工作正常。像这样:
def test():
worker()
time.sleep(5)
os.kill(int(os.getpid()), signal.SIGUSR1)
但是当我尝试将 worker 作为多进程启动时,该进程似乎无法接收到信号。
def main_process():
w = multiprocessing.Process(target=worker)
w.start()
time.sleep(5)
os.kill(w.pid, signal.SIGUSR1)
不会以这种方式调用处理程序。哪一部分可能是错误的?收不到信号,或者绑定不对?
我认为 os.kill 没有像我想象的那样工作。根本收不到信号。如何解决这个问题?
根据您发布的代码,工作人员将调用 Popen
设置信号处理程序,然后退出。
在您的代码中对 os.kill
的后续调用会将信号发送到已经过期的进程。
一般情况下,最好不要使用信号在进程间通信,而是使用Pipe
或Queue
。
以下示例更加健壮和灵活,因为它允许您向 worker 发送不同的命令。
import subprocess
import multiprocessing
def worker(queue):
p = subprocess.Popen(['omxplayer', '1.mov'], stdin = subprocess.PIPE)
while 1:
message = queue.get() # blocks until new message
p.stdin.write(message)
def main():
queue = multiprocessing.Queue()
w = multiprocessing.Process(target=worker, args=(queue,))
w.start()
queue.put('q')
我正在 Raspberry Pi 上编写一个异步视频播放程序。我需要在子进程中 运行 omxplayer 并在主进程中接收输入。当接收到一些输入时,主进程会将信号发送给子进程。
这是我的代码:
def worker():
p = subprocess.Popen(['omxplayer', '1.mov'], stdin = subprocess.PIPE)
def handler(signum, frame):
print p.pid
p.stdin.write('q') # keystroke of 'q' will quit omxplayer FYI
signal.signal(signal.SIGUSR1, handler) # can only be trigger in code
到目前为止看起来还不错。我可以 运行 worker() 并在代码片段中发送 SIGUSR1,它工作正常。像这样:
def test():
worker()
time.sleep(5)
os.kill(int(os.getpid()), signal.SIGUSR1)
但是当我尝试将 worker 作为多进程启动时,该进程似乎无法接收到信号。
def main_process():
w = multiprocessing.Process(target=worker)
w.start()
time.sleep(5)
os.kill(w.pid, signal.SIGUSR1)
不会以这种方式调用处理程序。哪一部分可能是错误的?收不到信号,或者绑定不对?
我认为 os.kill 没有像我想象的那样工作。根本收不到信号。如何解决这个问题?
根据您发布的代码,工作人员将调用 Popen
设置信号处理程序,然后退出。
在您的代码中对 os.kill
的后续调用会将信号发送到已经过期的进程。
一般情况下,最好不要使用信号在进程间通信,而是使用Pipe
或Queue
。
以下示例更加健壮和灵活,因为它允许您向 worker 发送不同的命令。
import subprocess
import multiprocessing
def worker(queue):
p = subprocess.Popen(['omxplayer', '1.mov'], stdin = subprocess.PIPE)
while 1:
message = queue.get() # blocks until new message
p.stdin.write(message)
def main():
queue = multiprocessing.Queue()
w = multiprocessing.Process(target=worker, args=(queue,))
w.start()
queue.put('q')