进程之管道Pipe,数据共享Manager,进程池Poo

 

#管道Pipe
from multiprocessing import Process,Pipe

#1
def func1(conn2):
    msg=conn2.recv()
    print('conn2:',msg)

if __name__ == '__main__':
    conn1,conn2=Pipe()
    p=Process(target=func1,args=(conn2,))
    p.start()
    conn1.send('你好')


#2
def func1(conn1,conn2):
    conn1.close()
    while 1:
        try:
            msg=conn2.recv()
            print('conn2',msg)
        except EOFError:
           break
if __name__ == '__main__':
    conn1,conn2=Pipe()
    p=Process(target=func1,args=(conn1,conn2))
    p.start()
    conn2.close()
    conn1.send('你好')
    conn1.close()
#数据共享 Manager
from multiprocessing import Process,Manager,Lock


#1
def func1(m_dic):
    m_dic['name']='刘伟'
    print('子进程结束')

if __name__ == '__main__':
    m=Manager()
    m_dic=m.dict({'name':'伟'})
    p=Process(target=func1,args=(m_dic,))
    p.start()
    print('主进程 :',m_dic)
    p.join()
    print('主进程 :', m_dic)

#2
def func1(m_dic,lock):
    with lock:#加锁
        m_dic['count']-=1

if __name__ == '__main__':
    lock=Lock()
    m_dic=Manager().dict({'count':100})
    lst=[]
    for i in range(20):
        p=Process(target=func1,args=(m_dic,lock))
        p.start()
        lst.append(p)
    [el.join() for el in lst]
    print('主进程m_dic:',m_dic)
#进程池
import time,os
from  multiprocessing import Process,Pool
#1
def func1(n):
    time.sleep(1)
    print(n)
if __name__ == '__main__':
    pool=Pool(4)
    pool.map(func1,range(100))



#2进程池与多进程运行时间对比
def func(n):
    print(n)
if __name__ == '__main__':
    pool=Pool(4)
    pool_s=time.time()
    pool.map(func,range(100))#map异步执行的方法
    pool_e=time.time()
    pool_dif=pool_e-pool_s

    p_lst=[]
    p_s=time.time()
    for i in range(100):
        p1=Process(target=func,args=(i,))
        p1.start()
        p_lst.append(p1)
    [p.join() for p in p_lst]
    p_e=time.time()
    p_dif=p_e-p_s
    print('进程池时间:', pool_dif)
    print('多进程时间:',p_dif)


#3apply同步执行的方法
def func(i):
    time.sleep(0.5)
    return i**2
if __name__ == '__main__':
    pool=Pool(4)
    for  i in range(10):
        ret=pool.apply(func,args=(i,))
        print(ret)


#4apply_async异步执行的方法
def func(i):
    time.sleep(2)
    print(os.getpid())
    return i**2
if __name__ == '__main__':
    pool=Pool(4)
    lst=[]
    for  i in range(10):
        ret=pool.apply_async(func,args=(i,))
        lst.append(ret)
    pool.close()#让进程池不再接受别的任务
    pool.join()#等待进程池进程全部执行完
    for i in lst:
        print('结果:',i.get())#get取不到会阻塞变为同步,所以用列表先放对象,在循环列表,元素点get取值


#5 pool.close(),pool.join()
def func(i):
    time.sleep(2)
    print(i)
    return i**2
if __name__ == '__main__':
    pool=Pool(4)
    for  i in range(10):
        ret=pool.apply_async(func,args=(i,))
    pool.close()#不允许别的任务在使用进程池,不是关闭进程池
    pool.join()#感知进程池中任务的方法
    print('主进程结束')

#6回调callback
def func1(i):
    print('func_id:',os.getpid())
    return i**2
def func2(m):
    print("func2_id:",os.getpid())
    print('func2>>>>',m)
    # return m**2

if __name__ == '__main__':
    pool=Pool(4)
    ret=pool.apply_async(func1,args=(10,),callback=func2)
    print('ret:',ret.get())
    pool.close()
    pool.join()
    print('主进程id:',os.getpid())

  

posted @ 2018-10-25 17:22  冒蓝火的加特林哒哒哒  阅读(286)  评论(0编辑  收藏  举报