【发布时间】:2021-10-01 13:05:09
【问题描述】:
我正在创建一个线程管理器类,它将执行任务作为线程处理并将结果传递给下一个流程步骤。该流程在第一次执行接收任务时正常工作,但第二次执行失败并出现以下错误:
...python3.8/concurrent/futures/thread.py", line 179, in submit
raise RuntimeError('cannot schedule new futures after shutdown')
RuntimeError: cannot schedule new futures after shutdown
任务来自Cmd.cmdloop 用户输入 - 因此,脚本是持久的并且不会关闭。相反,run 将被多次调用,因为从用户那里收到了输入。
我已经实现了ThreadPoolExecutor 来处理工作负载,并尝试使用concurrent.futures.as_completed 按时间顺序收集结果,因此每个项目都按完成顺序处理到下一步。
下面的run 方法在第一次执行时完美,但在第二次执行相同任务时返回错误(在第一次执行期间成功)。
def run ( self, _executor=None, _futures={}, ) -> bool :
task = self.pipeline.get( )
with _executor or self.__default_executor as executor :
_futures = { executor.submit ( task.target.execute, ), }
for future in concurrent.futures.as_completed ( _futures, ) :
print( future.result ( ) )
return True
因此,这个想法是每次调用run 都会创建并拆除带有上下文的executor。但是该错误表明在第一次执行后正确关闭了上下文,并且在第二次迭代期间调用run 时无法重新打开/重新创建......这个错误指向什么? ..我错过了什么?
任何帮助都会很棒 - 在此先感谢。
【问题讨论】:
-
实际上我遇到了同样的问题,在我的应用程序的一个模块中使用进程池上下文管理器,它启动了一些执行一些网络请求的进程。好像是在完成流程代码执行之前就关闭了pool模块
-
如果您解决了您的问题,请告诉我 - 它也可能适用于线程池
-
你读过这个吗? bugs.python.org/issue40093 似乎一旦调用了关机,即使等待为真,它也不再允许安排任何进一步的未来。不确定是否有实际的解决方案。
-
@AllanElder 感谢您的引用。这似乎表明上下文管理器不能在同一个应用程序运行实例中重新打开。一旦它关闭,它就完成了——这很奇怪。也许我需要将上下文语句放在
run方法之外以保持其持久性?
标签: python-3.x python-multithreading python-3.8 threadpoolexecutor concurrent.futures