Python:发现多进程各自私有外部数据/ (Process)/ 多进程间无法互相交流

发现了多进程(Process)间:对同一个外部变量,无论加不加同步锁,各进程都使用各自的变量而不会相互影响

 

首先在实践中发现了该问题,下列代码是后来测试问题所在专门写的:

定义了两个进程子类,分别对外部变量进行获取/获取与修改。

 

结果表明,两个子类所用的外部变量并不相同。

import time
from multiprocessing import Process, Lock

a = [1, 2, 3, 4]
mu = Lock()


#  定义同步锁数据的获取方法
def get():
    mu.acquire()
    b = a
    mu.release()
    return b


#  定义同步锁数据的增加方法
def add(s):
    mu.acquire()
    a.append(s)
    mu.release()


#  一个只读的类
class te(Process):
    def run(self):
        while True:
            print("QQQQQ:a", str(get()))
            time.sleep(1)


#  一个修改+读的类
class fe(Process):
    def run(self):
        while True:
            print("FFFFF:a", str(get()))
            add("x")
            time.sleep(1)


#  开始测试
if __name__ == '__main__':
    te().start()
    fe().start()

 

结果如下图:蓝色标记的是只读数据的类,黄色标记的是既修改又读取数据的类

可以明显看到,只读数据的类并没有获取到实时(真实)数据

 

进一步地,我发现它们实际上用着两套数据

修改,让class te 也增加数据:

class te(Process):
    def run(self):
        while True:
            print("QQQQQ:a", str(get()))
            add("y")
            time.sleep(1)

运行结果

 

甚至,不使用同步锁,结果都是一样的:

import time
from multiprocessing import Process, Lock

a = [1, 2, 3, 4]
mu = Lock()

def ad(s):
    a.append(s)

#  一个只读的类
class te(Process):
    def run(self):
        while True:
            print("QQQQQ:a", a)
            ad("y")
            time.sleep(1)


#  一个修改+读的类
class fe(Process):
    def run(self):
        while True:
            print("FFFFF:a", a)
            ad("x")
            time.sleep(1)


#  开始测试
if __name__ == '__main__':
    te().start()
    fe().start()
点击查看代码

 

经过一番百度,发现这是常识

 

附觉得表达最清楚的资料:

链接1:https://www.cnblogs.com/gmhappy/p/11863983.html

链接2:https://blog.csdn.net/houyanhua1/article/details/78236514?%3E

 

然而经过使用,发现Process定义的list好像用.append()会报错

 

附工具目录:

IDE:PyCharm

 

posted @ 2021-03-14 12:08  小鱼圆又圆  阅读(113)  评论(0)    收藏  举报