Python中的命名事件

时间:2014-01-20 11:52:50

标签: python events multiprocessing

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

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

2 个答案:

答案 0 :(得分: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等人中触发。通过:

$ 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放入文件系统的好位置。然而,它需要相当多的改进,因为我不想在你可能的时候解析传递的内容。此外,如果您计划拥有该事件的多个消费者,那么您将把它传播给只有一个消费者,因为它是一个队列。

答案 1 :(得分:0)

在我看来,这不是一个问题,关于这是否可能在Python中,但是这样的跨平台方法是否存在:如果有,那么即使没有直接编写的Python存在,人们总是可以使用subprocess.call()等进行系统调用。

至于是否有可能,我不能自称是专家,但有些搜索引起了these discussions,这可能对你有帮助。