多进程之间共享全局变量 python实现

线程之间是可以正常共享全局变量的,因为是共用同一片空间的,而进程之间所使用的是不同的内存空间
所以线程之间可以共享全局变量,因为共用一片空间
不同进程使用不同的空间,所以使用的资源本质上是不同的,所以一片空间上的变量变化了不会影响另一个空间的资源变化。
通过代码来对比2者的区别:
多线程实现:

import threading
import time
num = 100
def demo1():
    global num
    num += 100
    print(f'----demo1---num={num}')

def demo2():
    print(f'------demo2-----num={num}')

def main():
    t1 = threading.Thread(target=demo1)
    t2 = threading.Thread(target=demo2)
    t1.start()
    t2.start()
if __name__ == '__main__':
    main()

运行结果:
----demo1—num=200
------demo2-----num=200
说明线程之间共享了该全局变量

进程代码:

import multiprocessing
import time

num = 100
lst = []

def main():
    p1 = multiprocessing.Process(target=demo1)
    p2 = multiprocessing.Process(target=demo2)
    p1.start()
    p2.start()

def demo1():
    global num
    num += 100
    print(f'-----demo1----{num}')
    lst.append(num)
    print(lst)
    #time.sleep(1)


def demo2():
    time.sleep(1)
    print(f'-----demo2----{num}')
    print(lst)


if __name__ == '__main__':
    main()

执行结果:
-----demo1----200
[200]
-----demo2----100
[]
从执行结果可以验证不同进程,全局变量是不可以共享的
在此我测试了列表和全局变量num

那么该如何实现全局变量的进程共享呢?通过进程间交互的桥梁:Quene,这是multiprocess的内置类

import multiprocessing
from multiprocessing import Queue
def download(q):
    lst = [1,2,3]
    for i in lst:
        q.put(i)
    print('添加完毕')

def manage_data(q):
    #将队列的元素取出来,存到新的列表中
    man_data = list()
    while True:
        data = q.get()
        man_data.append(data)
        if q.empty():
            break
    print(man_data)

def main():
    q = Queue()
    p1 = multiprocessing.Process(target=download,args=(q,))
    p2 = multiprocessing.Process(target=manage_data,args=(q,))
    p1.start()
    p2.start()

执行结果:
添加完毕
[1, 2, 3]

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值