您的位置:首页 > 编程语言 > Python开发

python进程之间修改数据[Manager]与进程池[Pool]

2017-08-21 23:18 633 查看
#前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据


#Mnager就可以实现
import multiprocessing
import random
def f(l,n):
l.append(n)

if __name__ == '__main__':
m = multiprocessing.Manager()
m_dict = m.dict()
m_list = m.list(range(4))
p_list = []
for i in range(10):
p = multiprocessing.Process(target=f,args=(m_list,i))
p.start()
p_list.append(p)
for p in p_list:
p.join()
print(m_list)


 

结果如下

'''
结果如下,实现不同进程之间修改数据
[0, 1, 2, 3, 0, 3, 1, 4, 6, 2, 8, 9, 7, 5]

'''


# 进程池,允许同一时间最多有多少个进程在运行,因为进程非常耗费资源


import time
import multiprocessing

def Foo(i):
time.sleep(2)
return i + 100

def Bar(arg):
print("---exec down:",arg)

if __name__ == '__main__':
multiprocessing.freeze_support()
#windows的多进程必须要加这个一项
pool = multiprocessing.Pool(3)
for i in range(10):
pool.apply_async(func=Foo,args=(i,),callback=Bar)
#这句话有3个意思
#1、apply_async这个意思是异步执行
#2、这里的意思执行Foo,参数为i,callback这里的意思就是Foo这个函数的返回值作为Bar的函数输入,这个是自动传递的;
#3、这里还有一个意思是,执行Foo这个函数后,然后才执行Bar这个函数
#4、这里我们可以在Bar这个函数中接受子进程的执行结果,我们就可以把这个结果放在一个list中,从而也可以间接获取到子进程的执行结果
print("end")
pool.close()
pool.join()
#pool的时候必须先close,然后在join,这个必须要记住,pool的用法不一样


结果如下

end
---exec down: 100
---exec down: 101
---exec down: 102
---exec down: 103
---exec down: 104
---exec down: 105
---exec down: 106
---exec down: 107
---exec down: 108
---exec down: 109


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: