首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asyncio.run给出的RuntimeError循环是封闭的

Asyncio.run给出的RuntimeError循环是封闭的
EN

Stack Overflow用户
提问于 2021-11-16 15:15:29
回答 2查看 1.5K关注 0票数 1

当尝试创建具有异步函数和asyncio.run的简单coap服务器时,返回事件循环将关闭。代码如下:

代码语言:javascript
复制
import aiocoap
import aiocoap.resource as resource


class CoAPServer(resource.Resource):
    def __init__(self) -> None:
        super().__init__()

    async def render_get(self, request):
        print("Received GET request ...")
        return aiocoap.Message(code=aiocoap.GET, payload="hello friend".encode('utf8'))

    async def render_post(self, request):
        print("Received POST request ...")
        return aiocoap.Message(code=aiocoap.CHANGED, payload="that's me".encode('utf8'))

async def main():
    root = resource.Site()
    root.add_resource(['demo'], CoAPServer)
    task = asyncio.create_task(aiocoap.Context.create_server_context(root, bind=('127.0.0.1', 5683)))
    await task

if __name__ == "__main__":
    asyncio.run(main())

给出此错误:

代码语言:javascript
复制
Exception ignored in: <function RecvmsgSelectorDatagramTransport.__del__ at 0x7f9a04c57310>
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/aiocoap/util/asyncio/recvmsg.py", line 95, in __del__
    self.close()
  File "/usr/local/lib/python3.8/dist-packages/aiocoap/util/asyncio/recvmsg.py", line 83, in close
    self._loop.call_soon(self._protocol.connection_lost, None)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 719, in call_soon
    self._check_closed()
  File "/usr/lib/python3.8/asyncio/base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

相反,如果我使用get_event_loop().run_forever(),这是不推荐的,因为根据文档

应用程序开发人员通常应该使用高级异步函数,如asyncio.run(),并且很少需要引用循环对象或调用其方法。本节主要针对低级别代码、库和框架的作者,他们需要对事件循环行为进行更精细的控制。

代码语言:javascript
复制
if __name__ == "__main__":
    asyncio.get_event_loop().run_forever()

它起作用了。目前在wsl中使用python3.8.10

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-16 15:29:25

这是由于aiocoap仍然使用(在某些地方使用严重的)习惯用法来支持Python3.7或(在过时的部分中)甚至以前的版本而产生的问题。

我知道asyncio.run()是首选的,但在下一个aiocoap发行版(我也计划更新示例)之前,旧的成语是支持的各种版本中最适合使用的。

票数 1
EN

Stack Overflow用户

发布于 2021-11-16 15:52:58

使用asyncio.run(main())的代码在Unix系统上工作得很好。因此,最有可能的问题是aiocoap如何处理WSL环境中的事件循环。现在,您最好使用asyncio.get_event_loop().run_forever(),直到维护人员对库进行修补。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69991698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档