Python中的命名事件

2024-10-01 00:27:24 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,是否有一种跨平台的方式,在一个进程中创建类似Windows命名事件的东西,并将其从另一个进程设置为向第一个进程发送信号?在

我的具体问题是,我需要创建一个进程,该进程在启动时将检查自身的其他实例是否正在运行,如果是,则向它们发出退出信号。对于WindowsAPI,我将使用CreateEventlpName参数,以及SetEvent。在


Tags: 实例参数信号进程windows方式跨平台事件
2条回答

我花了大约一天的时间来寻找一个好的答案,下面是我此刻的想法:

可以使用信号向进程指示需要进行某些更改,但是在我正在处理的更复杂的遗留代码库中,它会导致进程崩溃。信令基于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等中触发。通过:

^{pr2}$

我现在倾向于使用kazooPython 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,也可以使用subprocess.call()等进行系统调用。在

至于这是否有可能,我不能说是个专家,但稍微搜索一下就发现了thesediscussions,这可能对你有帮助。在

相关问题 更多 >