python:16:多进程编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/genome_denovo/article/details/79861625

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

猜你喜欢

转载自blog.csdn.net/genome_denovo/article/details/79861625