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