信号处理程序无法在python

时间:2016-06-28 03:05:52

标签: python subprocess multiprocessing signals

我正在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)

但是当我尝试将工作程序作为多进程启动时,似乎进程无法接收信号。

def main_process():
    w = multiprocessing.Process(target=worker)
    w.start()
    time.sleep(5)
    os.kill(w.pid, signal.SIGUSR1)

不会以这种方式调用处理程序。哪部分可能错了?没有收到信号,或者绑定不对吗?

我认为os.kill没有像我想的那样工作。根本没有收到信号。如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

根据您发布的代码,工作人员将调用Popen设置信号处理程序,然后它将退出。

随后在您的代码中调用os.kill会将信号发送到已过期的进程。

一般情况下,最好不要使用信号在流程之间进行通信,而是使用PipeQueue

以下示例更加强大和灵活,因为它允许您向工作人员发送不同的命令。

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')