【发布时间】:2019-02-07 10:06:22
【问题描述】:
我正在使用 map_async 创建一个由 4 个工作人员组成的池。并为其提供要处理的图像文件列表 [Set 1]。
有时,我需要取消中间的处理,以便我可以处理一组不同的文件 [Set 2]。
所以一个例子是,我给了 map_async 1000 个文件来处理。然后想在处理完大约 200 个文件后取消剩余作业的处理。
此外,我想在不破坏/终止池的情况下进行此取消。这可能吗?
我不想终止池,因为在 Windows 上重新创建池是一个缓慢的过程(因为它使用“spawn”而不是“fork”)。而且我需要使用同一个池来处理一组不同的图像文件 [Set 2]..
# Putting job_set1 through processing. It may consist of 1000 images
cpu = multiprocessing.cpu_count()
pool = Pool(processes=cpu)
result = pool.map_async(job_set1, thumb_ts_list, chunksize=chunksize)
现在,我需要取消对这组 1 的处理。然后移动到另一个组(等待所有 1000 张图像完成处理不是一个选项,但我可以等待正在处理的当前图像完成)
<Somehow cancel processing of job_set1>
result = pool.map_async(job_set2, thumb_ts_list, chunksize=chunksize)
【问题讨论】:
-
这都是非常理论的,没有任何代码,但是如果你想“取消”在另一个进程中运行的作业,你基本上有两个选择:要么请其他进程停止,通过以某种方式向其发送消息,或者直接终止进程而无需询问。
-
继@zvone 之后:不开始任何更多工作并让现有任务完成(即使是无用的)就足够了吗?
-
@zvone:所以通过发送友好消息来停止进程很简单。但我们正在讨论取消处理作业池中的排队作业。正如我在问题中已经提到的那样,杀戮不是一种选择..
-
@DavisHerring:所以我可以等待当前图像被处理。但不要等到所有图像都被处理完......(因为完成整个工作需要很多时间,我想继续做另一份工作)
-
@vishal:易于实现的不是“当前图像”单数,而是在您决定取消时正在运行的所有内容。可以吗?
标签: python python-3.x multiprocessing python-multiprocessing python-internals