首页 > 解决方案 > 多处理只运行第一行代码

问题描述

嗨我面临着试图让多处理工作的问题。所以在apply_async调用之后,它只执行函数的第一行,没有别的。任何帮助将不胜感激。谢谢!

tp = ThreadPool(processes=4)

for file in listdir(alignDir):
    tp.apply_async(trim, (file,))
    sleep(0.5)

tp.close()
tp.join()
def trim(file):
    print("Trimming " + file)
    input_file = alignDir + file    
    print(input_file)

我得到以下结果

Start Trimming.
Trimming Africa_HA_merged_aligned.fasta
Trimming Africa_MP_merged_aligned.fasta
Trimming Africa_NA_merged_aligned.fasta
Trimming Africa_NP_merged_aligned.fasta
Trimming Africa_NS_merged_aligned.fasta
Trimming Africa_PA_merged_aligned.fasta
.
.
.
all the way to the end and nothing was actually done

代替

Start Trimming.
Trimming Africa_HA_merged_aligned.fasta
someinputfile string
Trimming Africa_MP_merged_aligned.fasta
anotherinputfile string
Trimming Africa_NA_merged_aligned.fasta
anotherinputfile string
.
.
.
and so on

标签: pythonmultiprocessing

解决方案


可能发生的trim是抛出异常,但该异常无处可去,因此被丢弃。该脚本要求在后台使用 来完成许多事情apply_async,但它从不要求结果(使用 ie get),因此这些结果 - 包括可能的例外 - 永远不会在任何地方实现。

解决此问题的一种方法是替换此循环:

for file in listdir(alignDir):
    tp.apply_async(trim, (file,))

使用类似方法的map方法,它“......将可迭代对象分割成许多块,作为单独的任务提交给进程池......”并且至关重要的是,“阻塞直到结果准备好”(docs),喜欢:

tp.map(trim, listdir(alignDir))

这些块的大小是可配置的;您现有的循环将相当于块大小为 1。

因为脚本现在等待结果,所以它会注意到是否有异常而不是结果,并且该异常会像往常一样传播和记录。


推荐阅读