【问题标题】:signal handler not working in python信号处理程序在 python 中不起作用
【发布时间】:2023-04-06 12:42:01
【问题描述】:

我正在 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() 并在代码 sn-p 中发送 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 没有像我想象的那样工作。根本收不到信号。如何解决这个问题?

【问题讨论】:

    标签: python subprocess multiprocessing signals


    【解决方案1】:

    根据您发布的代码,worker 将调用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')
    

    【讨论】:

    • 非常感谢!这正是我所需要的。
    • 还有一个问题,子进程完成后我应该如何结束工作进程?视频结束后我需要打破 while 循环。
    • 当 p.returncode 为 None: ... docs.python.org/2/library/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2018-02-04
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多