Python 3.10 中的 event_loops 问题

Posted

技术标签:

【中文标题】Python 3.10 中的 event_loops 问题【英文标题】:Problems with event_loops in Python 3.10 【发布时间】:2021-12-12 03:39:40 【问题描述】:

我尝试从 Binance Websocket 获取数据。使用 python 3.9 作为解释器它运行良好,但使用 3.10 它给我错误:(

代码如下:

import asyncio
from binance import AsyncClient, BinanceSocketManager


async def main():
    client = await AsyncClient.create()
    bm = BinanceSocketManager(client)
    # start any sockets here, i.e a trade socket
    ts = bm.trade_socket('BNBBTC')
    # then start receiving messages
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            print(res)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

我收到此错误:

DeprecationWarning: There is no current event loop
  loop = asyncio.get_event_loop()

我使用 PyCharm 作为 IDE。

有谁可以帮帮我吗?

【问题讨论】:

这不是错误,而是警告。 docs.python.org/3/library/… 抱歉,我不知道如何解决这个问题 【参考方案1】:

这是一个弃用警告,这意味着您调用的函数get_event_loop() 的行为将很快改变,因为它将不再创建新的事件循环,而是像get_running_loop 一样引发RuntimeError。从它的外观来看,预期的方法是显式地而不是隐式地创建一个新的事件循环。

if __name__ == "__main__":
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(main())

我不确定asyncio.set_event_loop(loop) 是否真的有必要。

【讨论】:

get_event_loop 本身并未被弃用。弃用适用于在没有循环运行时调用它。在 Python 的未来版本中,这样做会引发RuntimeError 没错,我会修正措辞。 asyncio.set_event_loop(loop) 在这里不是必需的。【参考方案2】:

运行偶数循环的推荐 api 是 asyncio.run(在 Python 3.7 中引入)。

示例可以修改采用:


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

【讨论】:

以上是关于Python 3.10 中的 event_loops 问题的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法匹配 Python ≥ 3.10 中的不等式?

您应该知道Python 3.10中的新特性!

Python 3.10 中的 6 个新特性,你体验了吗?

event_loop 在 Django>=3.1 异步视图中存在多长时间

如何在 Python 3.10 中的匹配情况下获取带空格的字符串

最近发布的 Python 3.10 中的 Match-Case 其实没有那么简单