multiprocessing 多进程变量理解

例一

从下面的程序中可以看出,新开的进程可以访问const.aList, 并且初始值是进程新建时的const.aList 变量值, 之后在主进程中或者新进程中修改该变量,两个进程中的变量互不影响。

from multiprocessing import Process
import os
import const

def fun():
	print("Son Process %s, aList is "%(os.getpid()),const.aList)
	const.aList = [-num for num in const.aList]
	print("Son Process %s, aList is "%(os.getpid()),const.aList)
	print("Son Process over")



if __name__ == "__main__":
	const.aList = [1,2,3,4,5]
	p = Process(target = fun)
	print("Main Process %s, before son process start ,aList is"%os.getpid(),const.aList)
	p.start()
	const.aList = [num**2 for num in const.aList]
	print("Main Process , after son process start, aList is",const.aList)
	p.join()	
	print("Main Process , after son process stop, aList is",const.aList)
	print("Main Process over")

其中,const.py文件内容如下:

aList = []

执行结果如下:

Main Process 27037, before son process start ,aList is [1, 2, 3, 4, 5]
Main Process , after son process start, aList is [1, 4, 9, 16, 25]
Son Process 27038, aList is  [1, 2, 3, 4, 5]
Son Process 27038, aList is  [-1, -2, -3, -4, -5]
Son Process over
Main Process , after son process stop, aList is [1, 4, 9, 16, 25]
Main Process over

例二(共享变量)

dict声明为Manager.dict()后,该变量便成为进程共享的变量,任一进程修改变量,其余进程都可以读到。

# 主文件 main.py
import os
from proc_fun import fun
import const
import multiprocessing
from multiprocessing import Manager


def main():
	manager = Manager()
	# 如果还有需要共享的词典,进行相同的赋值
	# 例如:const.anotherDict = manager.dict()
	const.aDict = manager.dict()
	# 写成下面这样相当于重新给变量赋值了,变成了普通的dict,不能在进程间共享
	# 错误做法 :const.aDict = {'1':'sun','2':'yi','3':'rong'}
	d = {'1':[1,2,3],'2':[4,5,6],'3':[7]}
	for key, value in d.items():
		const.aDict[key] = value
	print("const.aDict(Process %s)"%os.getpid(),const.aDict)	
	p= multiprocessing.Process(target = fun)
	p.start()
	p.join()
	print("const.aDict(Process %s)"%os.getpid(),const.aDict)


if __name__ == "__main__":
	main()
# proc_fun.py
import const
import os

def fun():
	# Manager.dict()当value为list(可变对象)时,不能直接修改,必须重新赋值。
	# 错误做法 :const.aDict['3'].append(100)
	l = const.aDict['3']
	l.append(100)
	const.aDict['3'] = l
	print("const.aDict(Process %s): "%os.getpid(),const.aDict)
# const.py
aDict = None

执行结果:

const.aDict(Process 2819) {'1': [1, 2, 3], '2': [4, 5, 6], '3': [7]}
const.aDict(Process 2821):  {'1': [1, 2, 3], '2': [4, 5, 6], '3': [7, 100]}
const.aDict(Process 2819) {'1': [1, 2, 3], '2': [4, 5, 6], '3': [7, 100]}

特别注意上面代码中的注释

例三:

import os
import const
import multiprocessing
from multiprocessing import Manager
import time
import random


def fun(i):
    for k in range(4):
        print("const.aDict(Process-%d): "%i,const.aDict)
        time.sleep(1)


def spe_fun():
    # Manager.dict()当value为list(可变对象)时,不能直接修改,必须重新赋值。
    # 错误做法 :const.aDict['3'].append(100)
    l = const.aDict['3']
    time.sleep(random.random())
    const.aDict["2"] = "sun"
    for i in range(2):
        time.sleep(1)
        l.append(i)
        const.aDict['3'] = l
        const.aDict[i] = "test-%d"%i


def main():
    manager = Manager()
    # 如果还有需要共享的词典,进行相同的赋值
    # 例如:const.anotherDict = manager.dict()
    const.aDict = manager.dict()
    # 写成下面这样相当于重新给变量赋值了,变成了普通的dict,不能在进程间共享
    # 错误做法 :const.aDict = {'1':'sun','2':'yi','3':'rong'}
    d = {'1':[1,2,3],'2':[4,5,6],'3':[7]}
    for key, value in d.items():
        const.aDict[key] = value
    print("const.aDict(Process-main): ",const.aDict)
    p_list = []
    for i in range(2):  
        p= multiprocessing.Process(target = fun, args = (i,))
        p_list.append(p)
        p.start()
    p_spe = multiprocessing.Process(target = spe_fun)
    p_spe.start()
    p_spe.join()
    for p in p_list:
        p.join()
    print("const.aDict(Process-main): ",const.aDict)


if __name__ == "__main__":
    main()
    

执行结果:

const.aDict(Process-main):  {'1': [1, 2, 3], '2': [4, 5, 6], '3': [7]}
const.aDict(Process-0):  {'1': [1, 2, 3], '2': [4, 5, 6], '3': [7]}
const.aDict(Process-1):  {'1': [1, 2, 3], '2': [4, 5, 6], '3': [7]}
const.aDict(Process-0):  {'1': [1, 2, 3], '2': 'sun', '3': [7]}
const.aDict(Process-1):  {'1': [1, 2, 3], '2': 'sun', '3': [7]}
const.aDict(Process-0):  {'1': [1, 2, 3], '2': 'sun', '3': [7, 0], 0: 'test-0'}
const.aDict(Process-1):  {'1': [1, 2, 3], '2': 'sun', '3': [7, 0], 0: 'test-0'}
const.aDict(Process-0):  {'1': [1, 2, 3], '2': 'sun', '3': [7, 0, 1], 0: 'test-0', 1: 'test-1'}
const.aDict(Process-1):  {'1': [1, 2, 3], '2': 'sun', '3': [7, 0, 1], 0: 'test-0', 1: 'test-1'}
const.aDict(Process-main):  {'1': [1, 2, 3], '2': 'sun', '3': [7, 0, 1], 0: 'test-0', 1: 'test-1'}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值