python - 多处理只运行第一行代码
问题描述
嗨我面临着试图让多处理工作的问题。所以在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
解决方案
可能发生的trim
是抛出异常,但该异常无处可去,因此被丢弃。该脚本要求在后台使用 来完成许多事情apply_async
,但它从不要求结果(使用 ie get
),因此这些结果 - 包括可能的例外 - 永远不会在任何地方实现。
解决此问题的一种方法是替换此循环:
for file in listdir(alignDir):
tp.apply_async(trim, (file,))
使用类似方法的map
方法,它“......将可迭代对象分割成许多块,作为单独的任务提交给进程池......”并且至关重要的是,“阻塞直到结果准备好”(docs),喜欢:
tp.map(trim, listdir(alignDir))
这些块的大小是可配置的;您现有的循环将相当于块大小为 1。
因为脚本现在等待结果,所以它会注意到是否有异常而不是结果,并且该异常会像往常一样传播和记录。
推荐阅读
- r - 如何将时间序列代码转换为自动代码以用于多个时间序列?
- azure - Pester 不会在 Azure 自动化中启动
- reactjs - 无法在 APS.NET Core 中使用 [FromRoute] 将 url 参数传递给 Objcet
- .net - Accord.Dll.Config 的用途
- pie-chart - Splunk Enterprise 饼图,包含来自不同搜索条件的计数
- omnet++ - 在 omnet++ 中调用 endSimulation() 后如何销毁消息?
- java - 如何从 spring ListenerContainerIdleEvent 执行手动偏移确认
- html - 如何在css中使用边距时响应html页面
- c# - LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”。其他方式怎么解决?
- swift - 推送视图控制器在集合视图单元格中不起作用