Python中的命名事件

Posted

技术标签:

【中文标题】Python中的命名事件【英文标题】:Named Event in Python 【发布时间】:2014-01-20 11:52:49 【问题描述】:

在 python 中,是否有一种跨平台的方法可以在一个进程中创建类似于 Windows 的名为 Event 的东西,并将其从另一个进程设置为向第一个进程发出信号?

我的具体问题是我需要创建一个进程,该进程在启动时将检查其自身的任何其他实例是否正在运行,如果是,则发出退出信号。对于 Windows API,我将使用带有 lpName 参数的 CreateEventSetEvent

【问题讨论】:

【参考方案1】:

我已经花了大约一天的时间来寻找一个好的答案,这就是我现在想出的:

可以使用信号向进程指示需要进行一些更改,但是在我正在处理的更复杂的遗留代码库中,它会导致进程崩溃。信号中断基于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 放入文件系统的好位置。然而,它需要相当多的改进,因为我不关心解析传递的内容,而你可能会这样做。此外,如果您计划拥有多个事件的消费者,您将只将其传播给一个消费者,因为它是一个队列。

【讨论】:

另一个类似的解决方案是以相同的方式使用套接字网络。这也可以是跨平台的。【参考方案2】:

在我看来,这与其说是在 Python 中是否可行,不如说是这样的跨平台方法是否存在:如果存在,那么即使直接不存在有写的 Python 存在,总是可以使用subprocess.call() 之类的方式进行系统调用。

至于是否有可能,我不能自称是专家,但搜索了一下thesediscussions,这可能对你有帮助。

【讨论】:

谢谢,但答案是否会像 Windows 事件一样给出确切的行为对我来说并不重要。我只需要能够向另一个不是子进程的进程发出信号(并且没有使用文件等技巧)。我猜其他操作系统也有这方面的功能。

以上是关于Python中的命名事件的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 命名空间和事件监听器中的“this”问题

vue之props和自定义事件的驼峰命名

Python3 中的 Python 命名空间包

Python中的“命名元组”是啥?

Python中的“命名元组”是啥?

Python中的命名空间是啥?