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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值