• python Multiprocessing 多进程应用


    在运维工作中,经常要处理大量数据,或者要跑一些时间比较长的任务,可能都需要用到多进程,不管是管理端下发任务,还是客户端执行任务,如果服务器配置还可以,跑多进程还是挺能解决问题的

    Multiprocessing Pool

    如果任务需要启动大量子进程,用一下multiprocessing Pool 是比较好的,类似如下用法

    #!/usr/bin/env python
    # coding:utf8
    #author:shantuwqk@163.com
    
    from multiprocessing import Pool
    
    import os,time,random
    
    
    def task_exec_time(name):
        print 'Run task %s(%s)....' %(name,os.getpid())
        start = time.time()
        time.sleep(random.random()*3)
        end = time.time()
    
        print 'Task %s runs %0.2f seconds.' %(name,(end - start))
    
    
    if __name__ == '__main__':
        print 'Parent process %s.' %os.getpid()
    
        p = Pool(8)
        for i in xrange(50):
            p.apply_async(task_exec_time,args=(i,))
    
        print 'Waitting for all subprocesses done....'
        p.close()
        p.join()
        print 'All subprocess done...'
    

    multiprocessing Queue

    启动进程后,如果需要进程间进行数据交换。用Queue,或pipes

    #!/usr/bin/env python
    # coding:utf8
    #author:shantuwqk@163.com
    
    from multiprocessing import Process,Queue
    import time,sys,random,os
    
    
    
    def task_write(q):
        for i in xrange(50):
            print 'Put %s to queue....' %i
            q.put(i)
            time.sleep(1)
    
    
    def task_read(q):
        while True:
            result = q.get(True)
            print 'Get %s from queue.' %result
    
    
    if __name__ == "__main__":
        #父进程创建Queue,并传给各个子进程:
        q = Queue()
        qw = Process(target=task_write,args=(q,))
        qr = Process(target=task_read,args=(q,))
    
        # 启动子进程pw,写入
        qw.start()
    
        # 启动子进程pr,读取:
        qr.start()
    
        # 等待pw结束:
        qw.join()
    
        # pr进程里是死循环,无法等待其结束,只能强行终止: terminate
        qr.terminate()
    

    小结:

    在Unix/Linux下,可以使用fork()调用实现多进程。

    要实现跨平台的多进程,可以使用multiprocessing模块。

    进程间通信是通过Queue、Pipes等实现的。

  • 相关阅读:
    个人项目作业
    软件工程个人博客作业
    软件工程热身作业
    OO第四单元作业总结
    OO第三单元作业总结
    OO第二单元作业总结
    酸甜苦辣皆阅历,悲欢离合尽人生——软件工程个人总结
    Centos7里yum出问题可以试试
    idea 报错 Two modules in a project cannot share the same content root
    关于本地git的补充
  • 原文地址:https://www.cnblogs.com/shantu/p/4598925.html
Copyright © 2020-2023  润新知