[python]模块-multiprocessing-多进程模块(1)

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()为不阻塞的方法

猜你喜欢

转载自blog.csdn.net/sszzyzzy/article/details/81153451