zoukankan      html  css  js  c++  java
  • day-4 python多进程编程知识点汇总

    1、 python多进程简介

      由于Python设计的限制(我说的是咱们常用的CPython)。最多只能用满1个CPU核心。Python提供了非常好用的多进程包multiprocessing,他提供了一套和多线程类似的接口,有start、run等方法,我们只需要定义一个函数,Python会替我们完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

    2、  注意事项

      a)在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join()方法 (实际上等同于wait)。对于多线程来说,由于只有一个进程,所以不存在此必要性。

      b)multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源)。

      c)多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。

    3、 常用接口

      Event():进程的事件用于主线程控制其他进程的执行,事件主要提供了三个方法wait、clear、set

      Queue():进程的队列,提供get和put方法

      Process():创建一个新的进程

      Lock():进程锁

      Semaphore:一种带计数的进程同步机制,当调用release时,增加计算,当acquire时,减少计数,当计数为0时,自动阻塞,等待release被调用

      Pipe():创建进程双向管道

      Manager():一种较为高级的多进程通信方式,它能支持Python支持的的任何数据结构,不限制多进程是否源于同一个父进程

      Lock():进程锁

      Pool():可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

      Condition():Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。

      

    4、  代码实例

       学习进程程通信:Queue,Pipe,Manage,Event

    '''
    学习进程程通信:Queue,Pipe,Manage,Event
    '''
    
    import multiprocessing
    import time
    
    #循环从进程队列中取数据
    def Proceedataget(q,p,parent_event,child_event,manage_d,manage_l):
        for i in range(10):
            print(q.get())
    
        for i in range(20,30):
            p.send(i)
        parent_event.set()
        child_event.wait()
    
        for i in range(20,30):
            print("B process:" + str(p.recv()))
    
        manage_d["1"] = 1
        manage_l.append("2")
    
    #循环从进程队列中写数据
    def Proceedataput(q,p,parent_event,child_event,manage_d,manage_l):
        for i in range(10):
            q.put(i)
    
        for i in range(40,50):
            p.send(i)
    
        child_event.set()
        parent_event.wait()
        for i in range(20,30):
            print("A process:" + str(p.recv()))
    
        manage_d["2"] = 2
        manage_l.append("2")
    
    if __name__ == "__main__":
    
        start_time = time.time()
    
        #定义一个进程队列
        q = multiprocessing.Queue()
        #定义一个进程双向管道
        parent_conn,child_conn = multiprocessing.Pipe()
        #定义两个进程事件
        parent_event = multiprocessing.Event()
        child_event = multiprocessing.Event()
        #定义两个Manager对象
        manage = multiprocessing.Manager()
        manage_d = manage.dict()
        manage_l = manage.list()
    
        #定义两个进程
        l = []
        p1 = multiprocessing.Process(target = Proceedataget,args=(q,child_conn,parent_event,child_event,manage_d,manage_l))
        p1.start()
        l.append(p1)
        p2 = multiprocessing.Process(target = Proceedataput,args=(q,parent_conn,parent_event,child_event,manage_d,manage_l))
        p2.start()
        l.append(p2)
    
        #等待进程执行完毕
        for p_list in l:
            p_list.join()
    
        end_time = time.time()
    
        print(manage_d)
        print(manage_l)
    
        print("Mutiple proccess cost : %d"%(end_time - start_time))
    View Code

      学习进程程通信:Condition

    '''
    学习进程程通信:Condition
    1 --- Father:今天学习怎么样?
    2 --- Child:今天学习很好
    3 --- Father:知识都听懂了吗?
    4 --- Child:知识都听懂了
    5 --- Father:干的不错,继续保持
    6 --- Child:好的
    Mutiple proccess cost : 19
    '''
    
    import multiprocessing
    import time
    
    #父亲对话,父亲先说
    def Conditionfather(cond):
        time.sleep(10)
        #父亲先说
        cond.acquire()
        print("1 --- Father:今天学习怎么样?")
        time.sleep(2)
        cond.notify()
    
        cond.wait()
        print("3 --- Father:知识都听懂了吗?")
        time.sleep(2)
        cond.notify()
    
        cond.wait()
        print("5 --- Father:干的不错,继续保持")
        cond.notify()
        time.sleep(2)
    
        #一定要加,否则父亲进程退出,无法知会儿子
        cond.release()
    
    #孩子对话
    def Conditionchild(cond):
        #儿子等父亲说完
        cond.acquire()
        cond.wait()
        print("2 --- Child:今天学习很好")
        time.sleep(1)
        cond.notify()
    
        cond.wait()
        print("4 --- Child:知识都听懂了")
        time.sleep(1)
        cond.notify()
    
        cond.wait()
        print("6 --- Child:好的")
        cond.notify()
        time.sleep(1)
    
        #保持程序严谨,也要加上
        cond.release()
    
    if __name__ == "__main__":
    
        start_time = time.time()
    
        #定义一个condition对象
        cond = multiprocessing.Condition()
    
        #定义两个进程
        l = []
        p1 = multiprocessing.Process(target = Conditionchild,args=(cond,))
        p1.start()
        l.append(p1)
        p2 = multiprocessing.Process(target = Conditionfather,args=(cond,))
        p2.start()
        l.append(p2)
    
        #等待进程执行完毕
        for p_list in l:
            p_list.join()
    
        end_time = time.time()
    
        print("Mutiple proccess cost : %d"%(end_time - start_time))
    View Code

     参考链接:https://docs.python.org/2/library/multiprocessing.html

  • 相关阅读:
    android 图片加载库 Glide 的使用介绍
    Android Glide数据更新及内存缓存、硬盘缓存清理
    Android中<meta-data>的使用
    分层,工厂模式,依赖注入控制反转
    Asp.Net_Web身份验证
    aspx后缀映射成html
    网站跳舞人代码
    Sqlerver_各类函数
    Sqlserver_时间用法
    Sqlserver_视图
  • 原文地址:https://www.cnblogs.com/python-frog/p/8673439.html
Copyright © 2011-2022 走看看