美文网首页
python多进程

python多进程

作者: 大鹏的鹏 | 来源:发表于2018-09-18 10:19 被阅读12次

    一:启动多进程

    1.1 multiprocessing是一个跨平台的python包,因此我们使用该工具包进行多进程的开发.
    from multiprocessing import Process
    #子进程需要执行的代码
    def run(str):
       while True:
           # os.getpid()获取当前进程id号
           # os.getppid()获取当前进程的父进程id号
           print(" %s--%s--%s"%(str, os.getpid(),os.getppid()))
           sleep(1)
    #创建子进程
    #target说明进程执行的任务
    p = Process(target=run, args=("test",))
    #启动进程
    p.start()
    
    #父进程的结束不能影响子进程,让父进程等待子进程结束再执行父进程
    process.join()
    
    1.2利用进程池生成进程.

    开多进程是为了并发,通常有几个cpu核心就开几个进程,但是进程开多了会影响效率,主要体现在切换的开销,所以引入进程池限制进程的数量。

    进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,初始化一个Pool时,可以指定一个最大进程数,如果超过这个数,那么请求就会等待,直到池中有进程结束,才会创建新的进程来执行

    from multiprocessing import Pool
    import os, time, random
    def run(name):
       print("子进程%d启动--%s" % (name, os.getpid()))
    if __name__ == "__main__":
       #创建多个进程
       #进程池
       #表示可以同时执行的进程数量
       #Pool默认大小是CPU核心数
       pp = Pool(2)
       for i in range(3):
           #创建进程,放入进程池同意管理
           pp.apply_async(run,args=(i,))
    
       #在调用join之前必须先调用close,调用close之后就不能再继续添加新的进程了
       pp.close()
       #进程池对象调用join,会等待进程池中所有的子进程结束完毕再去执行父进程
       pp.join()
    

    二,多进程之间的通信.

    进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。

    2.1进程队列queue
    from multiprocessing import Process, Queue
    import os, time
    
    def write(q):
        print("启动写子进程%s" % (os.getpid()))
        q.put("A")
        print("结束写子进程%s" % (os.getpid()))
    
    def read(q):
        print("启动读子进程%s" % (os.getpid()))
        while True:
            value = q.get(True)
            print("value = " + value)
        print("结束读子进程%s" % (os.getpid()))
    
    
    if __name__ == "__main__":
        #父进程创建队列,并传递给子进程
        q = Queue()
        pw = Process(target=write, args=(q,))
        pr = Process(target=read, args=(q,))
    
        pw.start()
        pr.start()
    
        pw.join()
        #pr进程里是个死循环,无法等待其结束,只能强行结束
        pr.terminate()
    
        print("父进程结束")
    
    
    2.2进程池中的Queue

    如果使用进程池pool创建进程的话,就需要使用Manager().Queue()

    from multiprocessing import Manager, Process, Pool
    import threading
    import random, time,os
    
    
    # queue,实现多进程之间的数据传递,其实就是个消息队列
    
    def write(q):
        print('---write thread is %s' % os.getpid())
        for value in ['A', 'B', 'C']:
            print("put %s to queue" % value)
            q.put(value)
    
    
    def read(q):
        print('---read thread is %s' % os.getpid())
        for i in range(q.qsize()):
            print("Get value is %s" % q.get(True))
    
    
    if '__main__' == __name__:
        print('---main thread is %s' % os.getpid())
        q = Manager().Queue()
        po = Pool()
        po.apply(write, args=(q,))
        po.apply(read, args=(q,))
        po.close()
        po.join()
        print('---end---')
    

    相关文章

      网友评论

          本文标题:python多进程

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