python-yield 与multiprocessing pool的问题

Backgroud

最近在处理比对后的bam文件,文件大小约为15G左右,由于内存限制,准备使用生成器的模型分块读取文件,同时进行多进程的处理,大致思路如下:
定义处理函数,使用yield生成器将待处理的数据分块投入到函数内,函数使用python内置多进程multiprocessing进行多核运行,使得运行速度能得到极大的提高。
目前遇到问题,使用函数后,单进程可以正常运行,并可以正常返回结果,但是使用pool进行操作时,函数无返回值,运行程序无结果。

    with open(out,'w') as f2:
        for region,reads in read_bam(args.infiles,bed):
            if (region not in regiondic) or (len(regiondic[region]) <10):continue
            reads = [read for read in reads]
            if int(args.thread) == 1:
                disp("Signle CPU mode")
                lines = MarkRead2Bed(reads,region,regiondic[region])
                f2.write("\n".join(lines)+"\n")
            else:
                pool.apply_async(MarkRead2Bed,args=(reads,region,regiondic[region],),callback=lambda x:f2.write("\n".join(x) +"\n"))
        pool.close()
        pool.join()

上述语句中,只有在args.thread =1的情况下,可以正常输出结果,而在thread >1的时候,没有返回结果。多次测试均无正常输出结果。经过网上检索原因,在一篇文章中提到原因,原因在于python的generator只能在单进程中被消费,无法传递到多进程的函数中。

解决思路:

将generator处理过程去除,使用迭代器迭代读取大文件,进行文件处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容