Python 3.x 断断续续;事件循环在未来完成之前停止。”;

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

在这个问题上我一直在发火

这里讨论的代码是一个开源项目的一部分:(我的FOSS项目的分支,)

出现问题的文件如下所示:

出现问题的代码段处于打开状态

下面是一个片段:

。。。
从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))
...
有时——也就是说,并不总是——代码在该点失败,出现
运行时错误:事件循环在将来完成之前停止。

我的问题是:

  • 间歇性故障的原因可能是什么

    在测试过程中有10%的时间失败(使用tox+nosets2),但90%的时间进展顺利

  • 我应该如何检测和/或检查和/或断言以防止这种情况发生

  • “恢复”错误和重做操作的最佳策略是什么



  • 我将第n次强调错误是间歇性发生的。而且不经常,但次数足够多,所以我觉得有必要追根究底。错误发生后,如果我再次运行代码——立即或延迟之后——几乎总是不会发生相同的错误。

    除非asyncio中出现错误,否则问题可能是由于调用隐藏在代码库中的
    loop.stop()
    引起的。您可能希望删除或禁用这些,因为它们与
    运行直到\u完成
    ,以及更现代的
    异步IO.run

    在代码库中的某个位置查找对
    loop.stop()
    的调用基本不兼容。您可能想删除这些,因为它们与
    run\u until\u complete
    ,以及更现代的
    asyncio.run
    @user4815162342 Nope,no
    loop.stop()
    在这两个有问题的行中根本不兼容
    factory
    是一个简单的
    partial
    包装另一个类,在该类中没有
    loop.stop()
    任何地方。记得我反复强调“间歇性”;代码中存在
    loop.stop()
    将导致“始终”而不是“间歇”。我知道这些行中不存在
    loop.stop()
    ,但它很可能存在于代码库中的其他地方,甚至可能存在于库中,该库在无法处理事件时停止循环。除非asyncio中出现错误,否则消息出现的唯一方法是有人调用
    loop.stop()
    ,所以这是我首先要查找的。如果这没有显示任何内容,下一步将是注释asyncio,以了解在没有事先调用
    loop.stop()
    -的情况下如何到达消息,但您更可能在上一步中找到
    loop.stop()
    。@user4815162342,如我之前所述(我可能没有说清楚,我的错)我从第139行开始追踪。在从第139行调用的调用堆栈中,我找不到任何
    loop.stop()
    的实例。此外——我确实强调了这一点——错误只是断断续续地发生。意思:有时(实际上很少)会发生错误。大多数情况下,代码运行没有任何问题。调用堆栈中任何位置存在
    loop.stop()
    都会导致持续错误,而不是间歇性错误。没问题,很高兴问题解决了!