python - Python 中的命名事件

标签 python events multiprocessing

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

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

最佳答案

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

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

相关文章:

Javascript 事件针对列表项而不是其元素

c# - 尝试在 C# 中执行按键事件时出错

python - 大于或等于 float 失败

python - 如何检查元组是否包含Python中的元素?

python - 如何将 pandas Dataframe 的每一列划分为一个系列?

python - 即使您只期望返回一个结果,队列对于多重处理是否有意义?

python-3.x - 如何从大字典中列出的每个类别的所有可能的值组合中创建数据框

python - ENOTFOUND : getaddrinfo ENOTFOUND rendezvous. runtime.heroku.com 在 heroku 运行 python manage.py migrate 之后

c# - 安全地引发事件线程

python - 多处理 AttributeError 模块对象没有属性 '__path__'