Python多进程--multiprocessing

作者: aialin | 来源:发表于2017-03-13 22:37 被阅读0次
    1. 简介

    multiprocessing包是python中用来提供多进程管理的包,能完全利用电脑的多核功能。在Unix与Windows中都能正常使用。

    1. Process模块

    • Process模块用来生产进程,通过调用start()启动进程。Process与threading.Thread的API一致。

    • class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})
      - 通过指定keyword参数来调用构造函数
      - group 仅仅是为了保持与threading.Thread的接口一致而存在,不需要设置(默认为None)
      - target 进程的函数。
      - name 是进程的名字。默认的名字为Process-N1:N2:……
      - args 一个tuple,值为target函数的参数,默认为无参数。

    • run() 如果在创建Process时不指定target,那么执行时没有任何效果。因为默认的run方法是判断如果不指定target,那就什么都不做

    • start() 激活传递给target的进程函数。

    • join([timeout]) 阻塞调用join的当前线程,直到join进程执行完毕或者timeout

      • 如果timeout为None,则无超时
      • 一个进程可以join好多次
      • 一个进程不能join自己,否则会造成死锁。(阻塞自己直到自己运行完毕)
      • 如果进程start之前调用join会导致错误
    • pid 返回进程的ID,进程生成之前,pid为None
      .

    • 一个简单的利用Process产生进程的程序如下:

    from multiprocessing import Process
    def f(num):
        print num
    if __name__ == '__main__':
        p = Process(target=f, args=('susan',))
        p.start()
        p.join()
    
    • 例子解释run函数的用法
    #创建2个进程
    p1 = Process() 
    p2 = Process(target=f2)
    p1.run = f1 #p1创建时,没有传递函数给target,启动时不会有任何效果。此处为其执行函数
    p1.start()
    p2.start()
    p1.join() #阻塞当前线程,直到f1执行完毕,再执行p2.join()
    p2.join() #阻塞当前线程,直到f2执行完毕,再执行print ’end‘
    print ’end‘
    
    • 例子解释join函数的用法
      1. 正常用法
    #创建2个进程
    p1 = Process(target=f1) 
    p2 = Process(target=f2)
    p1.start()
    p2.start()
    p1.join() #阻塞当前线程,直到f1执行完毕,再执行p2.join()
    p2.join() #阻塞当前线程,直到f2执行完毕,再执行print ’end‘
    print ’end‘
    
    2. 不使用join()
    
    #创建2个进程
    p1 = Process(target=f1) 
    p2 = Process(target=f2)
    p1.start()
    p2.start()
    #p1.join() #启动完p2.start()后,直接运行print 'end',再继续执行完f1和f2
    #p2.join() 
    print ’end‘
    
    3. start()和join()交替使用
    
    #创建2个进程
    p1 = Process(target=f1) 
    p2 = Process(target=f2)
    p1.start()
    p1.join() #阻塞当前线程,执行完f1后,再执行p2.start()启动f2
    p2.start()
    p2.join() #阻塞当前线程,执行完f2后,再执行print 'end'
    print ’end‘
    
    4. 两个进程只使用一个join()
    
    #创建2个进程
    p1 = Process(target=f1) 
    p2 = Process(target=f2)
    p1.start()
    p2.start()
    p1.join() #阻塞当前线程,执行完f1后,直接执行print ’end‘,再继续f2执行
    #p2.join()
    print ’end‘
    

    相关文章

      网友评论

        本文标题:Python多进程--multiprocessing

        本文链接:https://www.haomeiwen.com/subject/rpbqnttx.html