在Python中,是否有一种跨平台方法可以在一个进程中创建类似于Windows的名为Event的东西,并从另一个进程将其设置为向第一个进程发出信号?
我的具体问题是,我需要创建一个进程,该进程在启动时将检查其自身的任何其他实例是否正在运行,如果是,则通知它们退出。对于 Windows API,我将使用带有 lpName
参数的 CreateEvent
和 SetEvent
。
最佳答案
我花了大约一天的时间寻找一个好的答案,这就是我现在想到的:
可以使用信号向进程指示需要进行某些更改,但是在我正在处理的更复杂的遗留代码库中,它会导致进程崩溃。信令根据 python signal docs 中断各种 I/O 进程等。您可以使用 signal.SIGUSR1
实现信号处理程序
import signal
def signal_handler(signum, stack):
print('Signal %d received'%signum)
signal.signal(signal.SIGUSR1, signal_handler)
此代码可以在 Linux 等中触发。通过:
$ kill -s SIGUSR1 $pid
我目前倾向于kazoo Python Zookeeper 库。它需要站起来Zookeeper作为基础设施。
在我的情况下,我确实需要切换配置值。不过,Zookeeper 支持多种处理器间通信工具,可以满足您的需求。
更新:
我最终选择了命名管道 (FIFO),用 readline
在线程内调用它。
if not os.path.exists(fifo_name):
os.mkfifo(fifo_name)
while True:
with open(fifo_name, 'r') as config_fifo:
line = config_fifo.readline()[:-1]
print(line)
我使用 tempfile.gettempdir()
在文件系统中找到放置 FIFO 的好位置。然而,它需要相当多的改进,因为我不关心解析传递的内容,而你可能会解析。此外,如果您计划让该事件有多个消费者,那么您将只将其传播给一个消费者,因为它是一个队列。
关于python - Python 中的命名事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233346/