第一章: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
函数中传入多个实参