例一
从下面的程序中可以看出,新开的进程可以访问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'}