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等实现的。

posted @ 2015-06-24 23:14  shantuwqk  阅读(351)  评论(0编辑  收藏  举报