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

上一篇:设计模式 --> (1)工厂模式


下一篇:IDEA中文注释难看的简单解决办法