python:16:多进程编程

第一章:python

第16节:多进程编程

多进行变量的两种写法

1,函数apply_async

具体写法如下:
from multiprocessing import Pool#首先要导入模块,进程池的模块导入方式可以这样编写
import time#时间用于检测运行程序的运行状态
import os

def exonerate(name):#这个函数时程序运行内容,主要是多进程编程所要运行的程序,需要写在函数内
····print '%s process start at %s'%(name, time.ctime())#检测程序运行的起始时间
····os.system('exonerate --model protein2genome --showvulgar no --showalignment no --showquerygff no --showtargetgff yes --cores 4 --percent 70 --ryo "AveragePercentIdentity: %%pi\\n" ../ref/all.faa %s > ../raw_gff/%s.raw.gff'%(name, name))#运行程序本体
····print '%s process end at %s'%(name, time.ctime())#检测程序运行的终止时间

p=Pool(3)#进程池的实例,3表示可同时运行3个子进程,而要等待这3个进程中的某个进程结束之后再添加新的进程,但总之要保证最多有3个子进程在运行,其他进行需要排队。
for every in contig_list:
····p.apply_async(exonerate, args=(every,))#apply_async是进程池的标准函数,括号当中,exonerate表示运行程序的函数名称,而args=()内写入的是函数的传参值,如果程序运行函数只需要一个实参,写法为args=(实参,),只写一个字符串,并加上一个逗号,如果有多个实参则写法为args=(实参1,实参2,实参3 ……)
print 'Waiting for all subprocess done ...'
p.close()
p.join()#一定要加入.close().join()这个写法来控制进行
print 'All subprocess done !!!'

#注意:如果运行结果只输出了’Waiting for all subprocess done …‘和’%s process start at %s’两个语句,而没有输出’%s process end at %s’,则说明程序(上列os.system当中的内容)本身编写有错误,只是在函数当中进程池内,没有输出子进程的报错信息而已。

2,简化写法,函数map

具体写法如下:
def get_html(num):#这个运行的程序的函数只有一个形参,为传入的int形数字
pool=Pool(processes=10)#processes=10意义和上面的例子相同,表示同时运行10个子进程
pool.map(get_html, range(len(each_path)) )#map()函数运行需要两个参数,第一个参数是程序运行的函数名称,第二个参数是一个列表,注意,第二个参数是一个列表,与上面apply_async函数的不同之处在于,apply_async传参是单个值
pool.close()
pool.join()#这两个与上面相同

3,总结

总结:如果进程池程序运行函数需要传入一个实参,建议用map()方法,pool.map(*func*, *list*);如果,进程池程序运行函数需要传入多个实参,建议用apply_async方法;并且多个实参的相互关系可以写成一个字典,通过keys的列表建立一种循环机制,然后在apply_async函数中传入多个实参

4,多进程函数的返回值

如果多进程p.apply_async(exonerate, args=(every,))函数exonerate是有返回值的在分析过程中应该用如下方法得到返回值;
pool=Pool(processes=3)
raw=pool.apply_async(answers, args=(a1, a2))
pool.apply_async(runningprocessing, args=(cmd, output_dir, output_prefix))
after=pool.apply_async(answers, args=(output_dir, output_prefix))
pool.close()
pool.join()
(raw_1, raw_2)=raw.get()
(after_1, after_2)=trim.get()
如上在pool当中存在3个并行的函数分别是第一个answers,runningprocessing和第二个answers,分别有不同的输入参数;
只有answers函数有返回的return结果,为raw和after,通过**raw.get()after.get()**得到两个answers函数的返回值分别是(raw_1, raw_2),以及(after_1, after_2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值