Python 多处理未使用完整的 CPU 内核



我使用Regex检查了配对的FastQ文件的序列记录,并将匹配的序列写入相同的文件。我使用多处理来加快它的速度,但是当我使用20个过程运行它时,20个CPU核心都使用了2%,总时间与单个核心运行相同。这是否意味着正则搜索要比写入文件更快,因此流程正在等待?您能建议如何改善多处理吗?附件是代码。


def mycallback(x):
    SeqIO.write(x[0],outfile1,result.form)
    SeqIO.write(x[1],outfile2,result.form)
    SeqIO.write(x[2],outfile3,result.form)
    SeqIO.write(x[3],outfile4,result.form)
def check(x):
    if regex.search(r'^.{0,20}(?:'+fp+'){e<='+str(result.mm)+'}',str(x[0].seq),flags=regex.I) and regex.search(r'^.{0,20}(?:'+rp+'){e<='+str(result.mm)+'}',str(x[1].seq),flags=regex.I):
    return((x[0],x[1],'',''))
    elif regex.search(r'^.{0,20}(?:'+fp+'){e<='+str(result.mm)+'}',str(x[1].seq),flags=regex.I) and regex.search(r'^.{0,20}(?:'+rp+'){e<='+str(result.mm)+'}',str(x[0].seq),flags=regex.I):
    return((x[1],x[0],'',''))
    else:
    return(('','',x[0],x[1]))
p=Pool(int(result.n))
for i in izip(SeqIO.parse(result.fseq,result.form),SeqIO.parse(result.rseq,result.form)):
    p.apply_async(check,args=(i,),callback=mycallback)
p.close()
p.join()

python的pool.apply_async实现,调用主进程内部线程中的回调函数,并受到GIL的限制。因此,您正在等待所有文件依次写入。

回调应立即完成,因为否则处理结果的线程将被阻止。

我会想象您的正则执行速度比文件编写更快,因此您将从将回调发送到其自己的线程中受益最大(因此,可以立即将多个文件写入(。python线程在等待IO(文件写入(时应释放GIL,并且比进程要轻得多(启动更快(。

相关内容

  • 没有找到相关文章

最新更新