python进程之间修改数据[Manager]与进程池[Pool]详解编程语言

#前面的队列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 

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/20876.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论