Python 3.x 断断续续;事件循环在未来完成之前停止。”;
在这个问题上我一直在发火 这里讨论的代码是一个开源项目的一部分:(我的FOSS项目的分支,) 出现问题的文件如下所示: 出现问题的代码段处于打开状态 下面是一个片段:Python 3.x 断断续续;事件循环在未来完成之前停止。”;,python-3.x,python-asyncio,Python 3.x,Python Asyncio,在这个问题上我一直在发火 这里讨论的代码是一个开源项目的一部分:(我的FOSS项目的分支,) 出现问题的文件如下所示: 出现问题的代码段处于打开状态 下面是一个片段: 。。。 从aiosmtpd.smtp导入数据\u大小\u默认值,smtp,\u版本__ ... ... #args是ArgumentParser.parse_args的结果 工厂=部分( SMTP,args.handler, 数据\u size\u limit=args.size,启用\u SMTPUTF8=args.SMTPUT
。。。
从aiosmtpd.smtp导入数据\u大小\u默认值,smtp,\u版本__
...
...
#args是ArgumentParser.parse_args的结果
工厂=部分(
SMTP,args.handler,
数据\u size\u limit=args.size,启用\u SMTPUTF8=args.SMTPUTF8)
...
server=loop.run_,直到_完成(
创建_服务器(工厂,主机=args.host,端口=args.port))
...
有时——也就是说,并不总是——代码在该点失败,出现运行时错误:事件循环在将来完成之前停止。
我的问题是:
我将第n次强调错误是间歇性发生的。而且不经常,但次数足够多,所以我觉得有必要追根究底。错误发生后,如果我再次运行代码——立即或延迟之后——几乎总是不会发生相同的错误。除非asyncio中出现错误,否则问题可能是由于调用隐藏在代码库中的
loop.stop()
引起的。您可能希望删除或禁用这些,因为它们与运行直到\u完成
,以及更现代的异步IO.run
在代码库中的某个位置查找对loop.stop()
的调用基本不兼容。您可能想删除这些,因为它们与run\u until\u complete
,以及更现代的asyncio.run
@user4815162342 Nope,noloop.stop()
在这两个有问题的行中根本不兼容factory
是一个简单的partial
包装另一个类,在该类中没有loop.stop()
任何地方。记得我反复强调“间歇性”;代码中存在loop.stop()
将导致“始终”而不是“间歇”。我知道这些行中不存在loop.stop()
,但它很可能存在于代码库中的其他地方,甚至可能存在于库中,该库在无法处理事件时停止循环。除非asyncio中出现错误,否则消息出现的唯一方法是有人调用loop.stop()
,所以这是我首先要查找的。如果这没有显示任何内容,下一步将是注释asyncio,以了解在没有事先调用loop.stop()
-的情况下如何到达消息,但您更可能在上一步中找到loop.stop()
。@user4815162342,如我之前所述(我可能没有说清楚,我的错)我从第139行开始追踪。在从第139行调用的调用堆栈中,我找不到任何loop.stop()
的实例。此外——我确实强调了这一点——错误只是断断续续地发生。意思:有时(实际上很少)会发生错误。大多数情况下,代码运行没有任何问题。调用堆栈中任何位置存在loop.stop()
都会导致持续错误,而不是间歇性错误。没问题,很高兴问题解决了!