我有execute
函数,它调用一些非常长的任务。我想有可能取消这些任务。我想抛出一个异常并在外面捕捉它。问题是,我的异常在future
之外不可见。如何修复此代码以正确取消
def cancel_task(self):
while True:
process = get_process()
if process.status == "CANCELLED":
raise OperationCancelledException()
time.sleep(1)
def execute(self):
with ThreadPoolExecutor() as executor:
future = executor.submit(self.cancel_task)
result = some_very_long_task()
future.cancel()
return result
# somewhere in the code where execute() is called
try:
execute()
except OperationCancelledException:
pass
except Exception:
raise
已在此处初始化future对象:
然后,我们运行长任务:
对)
some_very_long_task()
的调用将首先运行到完成,然后再转到下一行。无论future对象此时是否引发异常,它都不会影响当前执行。实际上,如文档所述,您必须显式调用Future.result(),以重新引发提交过程中发生的任何异常(这里是^{因此,即使你称之为:
它只会在
some_very_long_task()
运行完成后运行并重新引发任何异常,因此毫无意义,因为它实际上没有取消/停止长任务的执行还有一个补充说明,将来的对象一旦启动就不能取消,因为documented:
即使将
some_very_long_task
提交给执行器并将timeout
参数设置为result()
也不会有帮助,因为它仍然会等待任务完成,只会在任务完成后超过超时时引发TimeoutError
替代解决方案
也许你会找到一种方法,但似乎
concurrent.futures
不是这个工作的工具。您可以考虑使用{a3}代替。some_very_long_task
生成一个新进程如果
status.txt
包含"PENDING"
,则输出:如果
status.txt
包含"PENDING"
,然后在脚本运行时更改为"CANCELLED"
,则输出:相关参考资料:
相关问题 更多 >
编程相关推荐