如何有效地无序使用python pool.imap_?

如何有效地无序使用python pool.imap_?,python,pool,unordered,Python,Pool,Unordered,我使用的是python多处理imap.unordered,期望值很高。 但是,我的进程处于深度睡眠状态,等待I/O numofSimulations=10 chromNamesList=['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chrX', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr

我使用的是python多处理imap.unordered,期望值很高。 但是,我的进程处于深度睡眠状态,等待I/O

numofSimulations=10
chromNamesList=['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chrX', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr20', 'chrY', 'chr19', 'chr22', 'chr21', 'chrM']
sim_nums = range(0, numofSimulations+1)
sim_num_chr_tuples=((sim_num,chrLong) for sim_num in sim_nums for chrLong in chromNamesList)

for arrayList in pool.imap_unordered(prepare_data_fill_arrays, (fillInputList(simNum,chrLong,x,y,z,a,b,c) for simNum,chrLong in sim_num_chr_tuples),chunksize=1):

    print('Worker pid %s in accumulate' %str(os.getpid()))
    array1 = arrayList[0]
    array2 = arrayList[1]
    accumulateArray(accumulatedArray1, array1)
    accumulateArray(accumulatedArray2, array2)
在这个伪代码中,我为每个simNum和chrLong对调用imap_unordered。 我提交了相同的模拟编号和不同的染色体,这样他们就不会试图在同一时间读取相同的色度输入文件

fillInputList
只填充inputList

准备数据填充数组
读取基于染色体的文件并填充数组

然而,既然imap_无序是以不同染色体的顺序同时提交的,为什么进程要等待

为什么

累积中的工人id XXXX


在准备数据填充数组中写入任何注释之前写入?

多处理无助于加快I/O速度。这取决于您的I/O源。我的观点是,我预计将运行24个进程(sim1,chr1)、(sim1,chr2)。。。(sim1,chrX)。因为每个色度都有不同的输入文件。现在只有1个或2个处理器在运行。“只有1个或2个进程在运行”是指存在24个进程,但大多数进程处于休眠状态,还是仅存在几个进程?这些过程真的完成并产生结果了吗?还是它们似乎在没有任何解释的情况下消亡了?您是否尝试过通过一个普通的
imap
调用来确保您的函数没有遇到异常?如果是这样,您可以尝试将
prepare\u data\u fill\u array
的整个主体包装在
try
/
块中,以捕获工作进程中的异常。此外,仅仅因为您的iterable有24个项,并不一定意味着将生成24个进程来处理它们。默认情况下,池生成的进程数不会超过核心数。辅助进程在被替换或加入之前可以处理多个任务。@skrrgwsme群集中有28个进程。因为我正在调用imap.unordered(,chunksize=1),所以我希望至少有24个进程正在运行。e、 g.:对于(sim1,chr1)(sim1,chr2)(sim1,chr3)。。。(sim1,chrX)