Harukaze

 

多进程变量访问

在Python中,多进程之间的内存是相互独立的,进程之间不能直接共享变量。因此,如果你在一个进程中修改了sysupload.manager_state的值,那么在其他进程中访问该变量时,访问到的值仍然是该变量的默认值,即0。

为了在多进程之间共享变量,你需要使用一些跨进程通信的机制,例如管道、共享内存、消息队列等。这些机制可以让你在多个进程之间传递数据,并实现进程间的同步和通信。

其中,共享内存是一种常用的跨进程通信机制,它可以让多个进程共享同一个内存区域。你可以使用multiprocessing.Value或multiprocessing.Array来创建共享内存变量,并将其传递给多个进程。这些进程可以同时访问共享内存变量,并在不同的进程中修改该变量的值。

from sysupload import SysUpload

# 创建共享内存变量
manager_state = multiprocessing.Value('i', 0)

# 定义任务函数
def taskManager(mpma):
    # 从共享内存变量中读取 manager_state 的值
    print(manager_state.value)

    # 将 manager_state 的值设置为 1
    manager_state.value = 1

    # 在单例类中修改 manager_state 的值
    sysupload = SysUpload()
    sysupload.manager_state = manager_state.value

if __name__ == '__main__':
    # 创建进程并启动任务
    mpma = multiprocessing.Manager()
    task_ma = multiprocessing.Process(target=taskManager, args=(mpma,))
    task_ma.start()
    task_ma.join()

    # 从单例类中读取 manager_state 的值
    sysupload = SysUpload()
    print(sysupload.manager_state)

在这个示例代码中,我们使用multiprocessing.Value创建了一个名为manager_state的共享内存变量,并将其传递给多个进程。在任务函数taskManager中,我们从共享内存变量中读取了manager_state的值,并将其设置为1。然后我们在单例类SysUpload中将manager_state的值设置为共享内存变量中的值。

在主进程中,我们从单例类中读取了manager_state的值,并打印出来。因为我们使用了共享内存变量,所以在多个进程之间可以共享manager_state的值,并实现进程间的同步和通信。


在多进程环境下,由于每个进程都有自己独立的地址空间和运行环境,因此单例模式的变量值在不同进程中是相互独立的,修改其中一个进程中的变量值并不会影响其他进程中该变量的值。

例如,在以下示例中,我们创建了一个简单的单例类,并在两个进程中分别修改了它的实例变量value:

import multiprocessing

class Singleton:
    __instance = None
    
    def __new__(cls):
        if not cls.__instance:
            cls.__instance = super().__new__(cls)
        return cls.__instance
        
    def __init__(self):
        self.value = 0

def func():
    s = Singleton()
    s.value = 123
    print("Process", multiprocessing.current_process().name, "set value to", s.value)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=func)
    p2 = multiprocessing.Process(target=func)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    s = Singleton()
    print("Final value is", s.value)

在这个示例中,我们使用multiprocessing模块创建了两个子进程,分别调用func函数来修改单例类的实例变量value。最后,我们再次访问单例类的实例变量,输出其最终值。

如果运行上述代码,可以发现输出结果如下:

Process Process-1 set value to 123
Process Process-2 set value to 123
Final value is 0

这表明,尽管在两个不同的进程中分别修改了单例类的实例变量value,但它们的修改互相独立,并没有对其他进程产生影响。最后输出的结果也证实了这一点。

因此,在多进程环境下,如果要实现跨进程的共享变量,需要使用特定的工具或技术来实现,例如共享内存、消息队列等。

posted on   Harukaze  阅读(166)  评论(2编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

统计

点击右上角即可分享
微信分享提示