Python 多进程,多个进程读取同一文件

Python 多进程,多个进程读取同一文件,python,multiprocessing,biopython,pysam,Python,Multiprocessing,Biopython,Pysam,我试图模拟一些dna测序读取,为了加速代码,我需要并行运行它 基本上,我要做的是:我对人类基因组的读取数据进行采样,我认为多处理模块的一对二过程试图从同一个文件(人类基因组)中获取数据。这些过程被破坏,无法获得所需的DNA序列。我尝试过不同的事情,但我对并行编程非常陌生,无法解决我的问题 当我用一个内核运行脚本时,它工作得很好 这就是我调用函数的方式 if __name__ == '__main__': jobs = [] # init the processes for

我试图模拟一些dna测序读取,为了加速代码,我需要并行运行它

基本上,我要做的是:我对人类基因组的读取数据进行采样,我认为多处理模块的一对二过程试图从同一个文件(人类基因组)中获取数据。这些过程被破坏,无法获得所需的DNA序列。我尝试过不同的事情,但我对并行编程非常陌生,无法解决我的问题

当我用一个内核运行脚本时,它工作得很好

这就是我调用函数的方式

if __name__ == '__main__':
    jobs = []
    # init the processes
    for i in range(number_of_cores):
        length= 100
        lock = mp.Manager().Lock()
        p = mp.Process(target=simulations.sim_reads,args=(lock,FastaFile, "/home/inigo/msc_thesis/genome_data/hg38.fa",length,paired,results_dir,spawn_reads[i],temp_file_names[i]))
        jobs.append(p)
        p.start()
    for p in jobs:
        p.join()
这是我用来获取读取的函数,每个进程都将数据写入不同的文件

def sim_single_end(lc,fastafile,chr,chr_pos_start,chr_pos_end,read_length, unique_id):

    lc.acquire()
    left_split_read = fastafile.fetch(chr, chr_pos_end - (read_length / 2), chr_pos_end)
    right_split_read = fastafile.fetch(chr, chr_pos_start, chr_pos_start + (read_length / 2))
    reversed_left_split_read = left_split_read[::-1]
    total_read = reversed_left_split_read + right_split_read
    seq_id = "id:%s-%s|left_pos:%s-%s|right:%s-%s " % (unique_id,chr, int(chr_pos_end - (read_length / 2)), int(chr_pos_end), int(chr_pos_start),int(chr_pos_start + (read_length / 2)))
    quality = "I" * read_length
    fastq_string = "@%s\n%s\n+\n%s\n" % (seq_id, total_read, quality)
    lc.release()
    new_record = SeqIO.read(StringIO(fastq_string), "fastq")
    return(new_record)
以下是回溯:

回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3.5/multiprocessing/process.py”,第249行,在引导程序中
self.run()
文件“/usr/lib/python3.5/multiprocessing/process.py”,第93行,正在运行
自我目标(*自我参数,**自我参数)
sim_ecc_中的第107行文件“/home/inigo/Dropbox/PycharmProjects/circ_dna/simulations.py”
新建读取=模拟单端(lc、快速文件、chr、chr位置开始、chr位置结束、读取长度、读取id)
文件“/home/inigo/Dropbox/PycharmProjects/circ_dna/simulations.py”,第132行,模拟单端
new_record=SeqIO.read(StringIO(fastq_字符串),“fastq”)
文件“/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/_-init__.py”,第664行,已读
first=next(迭代器)
文件“/usr/local/lib/python3.5/dist packages/Bio/SeqIO/_init__.py”,第600行,在parse中
对于i中的r:
文件“/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/QualityIO.py”,第1031行,在FastQphrediter中
对于FastQGeneraliator(句柄)中的标题行、顺序字符串、质量字符串:
文件“/usr/local/lib/python3.5/dist packages/Bio/SeqIO/QualityIO.py”,第951行,在FastQGeneraliator中
%(标题行、序号、序号(质量字符串))
ValueError:id:6-chr1_KI270707v1|u random | left_pos:50511537-50511587 | right:5051214-50511264(0和100)的序列长度和质量值不同。

我是这个答案的执行者,我几乎在一年前就做过。问题是我用来读取人类基因组文件(pysam)的软件包失败了。这个问题是调用多处理时的输入错误

从作者的回复来看,这应该是可行的:

 p = mp.Process(target=get_fasta, args=(genome_fa,))
注意“,”以确保传递元组


有关更多详细信息,请参见

您尚未显示错误的回溯。如果进程每次都写入不同的文件,您可以事先将它们的所有读取行随机分配(确保没有重叠),将该列表分块并将一个分块传递给每个进程。只要你阻止他们同时读取文件,每个进程只会查看他们预先分配的数据块。除了错误本身,你已经包含了回溯。@roganjosh Hi!我已经添加了回溯。我已尝试阻止他们同时使用
Lock()
读取文件。然而,它没有起作用。我应该如何防止他们同时读取文件?@roganjosh我在Biopython和其他软件包开始停止之前添加了回溯,因为我试图编写一个空序列。我认为这不相关。不过,为了以防万一,我添加了它。我添加了完整的回溯,谢谢你的帮助