zoukankan      html  css  js  c++  java
  • 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等实现的。

  • 相关阅读:
    维护是关键 刻录机不读/刻盘故障实例排除
    压缩viewstate
    采用"软改"的方式激活Windows 7
    开启VAIO的VT
    比较通用的存储过程分页
    linux如何安装声卡驱动
    给Fedora11安装五笔
    导入CSV文件到数据库
    Ubuntu第一次登录用户名和密码错误不能登录
    CSS中Position、absolute、Relative、fixed、static的用法
  • 原文地址:https://www.cnblogs.com/shantu/p/4598925.html
Copyright © 2011-2022 走看看