python 多进程中的变量问题.

最近写python程序,发现python的for循环太慢了,希望能通过多进程加速,加快程序速度。

程序功能:期望通过多进程把每一次循环的结果都保存在一个字典dict里,但是实际输出发现字典是空的,程序功能类似如下:

import multiprocessing

MP = {}

def putone(x):
    a,b=x[0],x[1]
    b[a]=2*a
    MP[a] = 2*a



if __name__ == '__main__':
    
    
    A=[1,2,3,4,5]
    mp={}
    B = [mp for i in range(len(A))]
    cores = multiprocessing.cpu_count() // 2
    pool = multiprocessing.Pool(cores)
    pool.map(putone, zip(A,B))
    pool.close()
    pool.join()
    print(mp)
    print(MP)

但是打印出来的dict都是空的。

{}
{}

我对其进行很多次尝试,最后发现一方面希望多进程加速for循环,一方面希望公有变量MP保存每一次for循环的结果输出,是矛盾的。因为开起了多进程,每个进程拥有独立的地址空间,变量空间,也就是说在上面程序中每个进程都会维护一个独立的MP变量,所以最后打印出来的MP结果是空的。而同一进程的多个线程是共享变量空间的,所以上述程序采用多线程执行较好。

反思:在学习操作系统的时候,我能很清楚地认识到不同进程拥有独立的地址空间,但是一写程序就犯了这样的错误,理论需要实践的学习才能深入人心。

解决方法:
1.多线程
2. 使用 multiprocessing.Manager() 共享变量
参考链接:Python 进程之间共享数据

import multiprocessing

MP = multiprocessing.Manager().dict()

def putone(x):
    a,b=x[0],x[1]
    b[a]=2*a
    MP[a] = 2*a

if __name__ == '__main__':
    
    A=[1,2,3,4,5]
    mp=multiprocessing.Manager().dict()
    B = [mp for i in range(len(A))]
    cores = multiprocessing.cpu_count() // 2
    pool = multiprocessing.Pool(cores)
    pool.map(putone, zip(A,B))
    pool.close()
    pool.join()
    print(mp)
    print(MP)

输出结果:

{1: 2, 3: 6, 5: 10, 2: 4, 4: 8}
{1: 2, 5: 10, 2: 4, 3: 6, 4: 8}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值