【发布时间】:2018-09-12 09:23:15
【问题描述】:
我需要对 python 中的信号处理程序进行一些说明,因为我不完全了解它们的工作原理、如何使用它们以及有什么限制。
我打算在 linux 上使用 USR 信号,以便与作为服务在后台运行的 python 程序进行通信。
我发现,正如预期的那样,我发送的信号似乎会立即以异步方式进行处理。
因此,我曾经认为注册的信号处理程序在它们自己的线程中运行,我认为这可以解释为什么以下代码会在循环发送信号时一次打印多行 Signal handler called with signal 10
#!/usr/bin/python3.5
# This is the file signal_example.py
import signal, time, os
def handler(signum, frame):
print('Signal handler called with signal', signum)
time.sleep(20)
signal.signal(signal.SIGUSR1, handler)
time.sleep(100)
#!/usr/bin/bash
for ((i=0;i<100;i=i+1)); do
killall -s SIGUSR1 signal_example.py;
done
但是,文档指出 (https://docs.python.org/3.4/library/signal.html)“Python 信号处理程序始终在 Python 主线程中执行,即使信号是在另一个线程中接收到的。”。此外,对于上述示例,我没有看到在我的系统上运行的单独线程。
我现在想知道,我使用信号的方法的实际含义和限制是什么,以及我如何才能正确地做相关的事情,例如调用的信号处理程序实例之间的通信。
例如,在某些情况下,我希望能够延迟信号处理程序中某些代码的执行,直到处理完之前的同类信号。 另外我不明白将“并行”处理多少信号以及“队列”已满时会发生什么......
我一直在研究 Pyhton 的 asyncio,它似乎提供了对异步代码的一些控制,并且还提供了自己的注册信号处理程序的方式。它似乎提供了一些帮助,但是,它似乎对我没有多大帮助,因为我看到的行为(收到的信号几乎被处理)实际上是我想要的。我见过的asyncio 信号处理程序的使用似乎在事件循环中执行信号。在我开始的部分阻塞代码中,这可能为时已晚。我可以在单独的线程中运行其中的一些(使用相应的asyncio 函数),但不能使整个代码成为非阻塞的。
【问题讨论】:
标签: python signals python-multithreading python-asyncio