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 问题的主要内容,如果未能解决你的问题,请参考以下文章
event_loop 在 Django>=3.1 异步视图中存在多长时间