据我所知,TimeoutError实际上是在您期望的时间引发的,而不是在任务完成之后引发的。
但是,您的程序本身将继续运行,直到完成所有正在运行的任务。这是因为当前正在执行的任务(在您的情况下,可能是所有已提交的任务,因为您的池大小等于任务数)实际上并未被“杀死”。
引发TimeoutError,以便您可以选择不等到任务完成(而是执行其他操作),但是任务将继续运行直到完成。只要执行器的线程/子进程中有未完成的任务,python就不会退出。
据我所知,不可能仅“停止”当前正在执行的期货,而只能“取消”尚未开始的计划任务。在您的情况下,将没有任何东西,但是假设您有5个线程/进程的池,并且您想处理100个项目。在某个时候,可能有20个完成的任务,5个正在运行的任务和75个计划的任务。在这种情况下,您可以取消这76个计划的任务,但是无论您是否等待结果,正在运行的4个任务将一直持续到完成。
即使无法做到这一点,我想也应该有一些方法来达到您期望的最终结果。也许此版本可以在途中为您提供帮助(不确定其功能是否完全符合您的要求,但可能有一定用处):
import concurrent.futuresimport timeimport datetimemax_numbers = [10000000, 10000000, 10000000, 10000000, 10000000]class Task: def __init__(self, max_number): self.max_number = max_number self.interrupt_requested = False def __call__(self): print("Started:", datetime.datetime.now(), self.max_number) last_number = 0; for i in xrange(1, self.max_number + 1): if self.interrupt_requested: print("Interrupted at", i) break last_number = i * i print("Reached the end") return last_number def interrupt(self): self.interrupt_requested = Truedef main(): with concurrent.futures.ThreadPoolExecutor(max_workers=len(max_numbers)) as executor: tasks = [Task(num) for num in max_numbers] for task, future in [(i, executor.submit(i)) for i in tasks]: try: print(future.result(timeout=1)) except concurrent.futures.TimeoutError: print("this took too long...") task.interrupt()if __name__ == '__main__': main()通过为每个“任务”创建一个可调用对象,并将其提供给执行器,而不仅仅是简单的函数,您可以提供一种“中断”任务的方法。提示:删除
task.interrupt()一行,看看会发生什么,这可能会使您更容易理解我在上面的详细解释;-)



