簡體   English   中英

Python多處理未使用完整的CPU核心

[英]Python multiprocessing isn't using full cpu cores

我使用正則表達式檢查配對的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,並且比進程輕(啟動速度更快)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM