• 进程之管道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())
    

      

  • 相关阅读:
    常用/常见Java Web 服务器/应用服务器Logo图文介绍
    三个快速且简单的让你的大脑安静下来的方法
    怎样判断自己是否在程序员平庸者之列?
    “好奇号”火星车和它搭载的软件(来自Erlang程序员的观点)
    旁观者效应”是如何毁掉我们的代码的
    怎么理解面向对象和面向过程到底的本质区别?
    面向对象方法论与结构化方法论的本质区别【转】
    不懂技术的人不要对懂技术的人说这很容易实现
    最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告
    计算机专业的学生必须掌握的五门课程 不能掌握他们就不应该获得学位
  • 原文地址:https://www.cnblogs.com/PythonMrChu/p/9851328.html
Copyright © 2020-2023  润新知