栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python Asyncio-RuntimeError:无法关闭正在运行的事件循环

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python Asyncio-RuntimeError:无法关闭正在运行的事件循环

为了回答最初提出的问题,不需要

close()
运行循环,您可以对整个程序重用同一循环。

给定更新中的代码,您

queue_manager
可能会像这样:

try:    self.loop.run_until_complete(future)except Exception as e:    self.check_in_records()    self.reconnect()    self.start_job()

取消

future
是没有必要的,据我所知没有任何作用。这不同于专门对做出反应的参考答案
KeyboardInterrupt
,特别是因为它是由asyncio本身引发的。
KeyboardInterrupt
可以
run_until_complete
在将来尚未真正完成的情况下进行传播。
Ctrl-C
在asyncio中正确处理是非常困难的,甚至是不可能的(有关详细信息,请参见此处),但是幸运的是,问题根本不
Ctrl-C
存在,而是协程引发的异常。(请注意,
KeyboardInterrupt
它不会继承自
Exception
,因此,
Ctrl-C
除非主体不执行。)

我取消了未来,因为在这种情况下,还有其他待处理的任务,并且我想从本质上删除那些任务并开始一个新的事件循环。

这是一件正确的事情,但是(已更新)问题中的代码仅取消了一个已传递给的未来

run_until_complete
。回想一下,future是将在以后提供的结果值的占位符。提供该值后,可以通过调用进行检索
future.result()
。如果将来的“价值”是一个例外,
future.result()
将引发该例外。
run_until_complete
具有约定,它将在给定的未来产生值之前一直运行事件循环,然后返回该值。如果“值”实际上是要提高的例外,
run_until_complete
则将重新提高它。例如:

loop = asyncio.get_event_loop()fut = loop.create_future()loop.call_soon(fut.set_exception, ZeroDivisionError)# raises ZeroDivisionError, as that is the future's result,# manually setloop.run_until_complete(fut)

当所讨论的future实际上是a时

Task
,一个特定于异步的对象将协程包装为a
Future
,这种future的结果就是协程返回的对象。如果协程引发异常,则检索结果将重新引发它,因此
run_until_complete

async def fail():    1/0loop = asyncio.get_event_loop()fut = loop.create_task(fail())# raises ZeroDivisionError, as that is the future's result,# because the coroutine raises itloop.run_until_complete(fut)

处理任务时,

run_until_complete
完成意味着协程也已经完成,返回值或引发异常(由
run_until_complete
返回或引发确定)。

另一方面,取消任务的工作方式是安排要恢复的任务以及将

await
其挂起的表达式提高
CancelledError
。除非任务专门捕获并抑制了此异常(行为良好的异步代码不应该这样做),否则该任务将停止执行,并且
CancelledError
将成为其结果。但是,如果协程在
cancel()
被调用时已经完成,那么
cancel()
将无能为力,因为没有待处理
await
的注入
CancelledError



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407417.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号