Skip to main content
 首页 » 编程设计

python之需要将更新事件传递给同一 python 脚本的多个运行实例

2025年05月04日8yyy_WW

我需要将更新事件传达给我的 python 脚本的所有运行实例,我希望代码尽可能简单。我对正在运行的进程之间进行通信的经验为零。到目前为止,我一直在读/写配置文件,每个实例都会读取和/或更新这些文件。

这是我编写的一些伪代码(某种简单的模板),让我思考如何解决这个问题。请尝试帮我填空。请记住,我没有套接字、线程等方面的经验……

import process # imaginary module 
 
class AppA(): 
    def __init__(self): 
        # Every instance that opens will need to attach 
        # itself to the "Instance Manager". If no manager 
        # exists, then we need to spawn it. Only one manager 
        # will ever exist no matter how many instances are 
        # running. 
        try: 
            hm = process.get_handle(AppA_InstanceManager) 
        except NoSuchProgError: 
            hm.spawn_instance(AppA_InstanceManager) 
        finally: 
            hm.register(self) 
        self.instance_manager = hm 
 
    def state_update(self): 
        # This method won't exist in the real code, however, 
        # it emulates internal state changes for the sake of 
        # explaination. 
        # 
        # When any internal state changes happen, we will then 
        # propagate the changes outward by calling the 
        # appropriate method of "self.instance_manager". 
        self.instance_manager.propagate_state() 
 
    def cb_state_update(self): 
        # Called from the "Instance Manager" only! 
        # 
        # This may be as simple as reading a known 
        # config file. Or could simply pass data 
        # to this method. 
 
 
class AppA_InstanceManager(): 
    def __init__(self): 
        self.instances = [] 
 
    def register_instance(self, instance): 
        self.instances.append(instance) 
 
    def unregister_instance(self, instance): 
        # nieve example for now. 
        self.instances.remove(instance) 
 
    def propagate_state(self): 
        for instance in self.instances: 
            instance.cb_state_update(data) 
 
if __name__ == '__main__': 
    app = AppA() 

有什么建议吗?

请您参考如下方法:

这种设计有几种选择。

你可以使用消息队列,它是为这类东西而设计的,例如AMQP 或一些 ZeroMQ 或类似的东西。

或者您可以使用诸如 Redis 或其他(内存中)数据库之类的东西来进行同步。

如果你不想使用类似的东西,你可以使用多处理模块同步的东西。

或者使用特定于平台的 IPC 系统,例如通过 mmap、sysv 套接字等共享内存

如果你想按照你解释的方式做事,你可以看看 Twisteds perspective broker。