python语言中因为有全局锁所以多线程并不能带来效果的提升,所以要采用多进程模块去掉用多个cpu同时工作达到速度的提升。
multiprocessing 里有很多有用的模块
Process
最基础的启动一个进程的方法。
import multiprocessing
#定义子进程
def func1(data,idx):
print str(data),idx
data=‘hahaha’
#指定子进程的 函数 和 参数表
p_vec = []
for i in range(3):
p = multiprocessing.Process(target = func1 ,args = (data,i,))
p.start()# 子进程开始工作
p_vec.append(p)
for p in p_vec:
p.join()# 阻塞主进程,阻塞到子进程结束时刻
这里就实现了三个子进程共同工作
后来因为对python的内存机制不是很了解,导致程序运行久了内存满了被kill掉,可以用子进程不断接力的方式来处理
Pool
#!/usr/local/python27/bin/python2.7
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import multiprocessing
import time
import os
def worker(info):
print "[task] data_idx: %2s pid:%s ts:%s"%(str(info) ,os.getpid(), str(time.time()) )
time.sleep(1)
print '[task] end'
return str(info)
def main(MODE):
pool = multiprocessing.Pool(processes = 3, maxtasksperchild = 4)
for i in range(20):
print '[main] start a task'
if MODE == 1:
p = pool.apply_async(func = worker , args = (i,) )
elif MODE == 2:
p = pool.apply(func = worker , args = (i,))
print '[main] get return : ',p
elif MODE == 3:
obj = pool.apply_async(func = worker , args = (i,) )
p = obj.get()
print '[main] get return : ',p
pool.close()
pool.join()
print '[main] all done'
if __name__ == '__main__':
MODE = 1
main(MODE)
maxtasksperchild定义的就是每个子进程接任务的个数,超了之后就重新启动新的子进程。python2.6不支持这个参数。
pool.apply()为阻塞主进程的启动子进程方法
pool.apply_async()为不阻塞的方法