如何打破(异步)websocket获取循环,该循环不';你没有收到任何信息吗?
此代码打印来自websocket连接的所有消息:如何打破(异步)websocket获取循环,该循环不';你没有收到任何信息吗?,websocket,python-asyncio,Websocket,Python Asyncio,此代码打印来自websocket连接的所有消息: class OrderStreamer: 定义初始化__(ᬑ): ᬑ.终止标志=False #接收数据流的工作线程 ᬑ.辅助线程=线程。线程( 目标=ᬑ.辅助线程功能, daemon=True ) def启动_流媒体(ᬑ, from_scheduler=False): ᬑ.worker_thread.start() def终止(ᬑ): ᬑ.终止标志=True def辅助线程功能(ᬑ): 异步运行(ᬑ.aio_func())#块 异步定义aio_函
class OrderStreamer:
定义初始化__(ᬑ):
ᬑ.终止标志=False
#接收数据流的工作线程
ᬑ.辅助线程=线程。线程(
目标=ᬑ.辅助线程功能,
daemon=True
)
def启动_流媒体(ᬑ, from_scheduler=False):
ᬑ.worker_thread.start()
def终止(ᬑ):
ᬑ.终止标志=True
def辅助线程功能(ᬑ):
异步运行(ᬑ.aio_func())#块
异步定义aio_函数(ᬑ):
与异步\
aiohttp.ClientSession()作为会话\
session.ws_connect(streams_url)作为wsock\
anyio.create_task_group()作为tg:
wsock中msg的异步:
打印(消息数据)
如果ᬑ.终止标志:
等待wsock.close()
问题是,如果没有消息到达,循环就永远没有机会检查terminate\u flag
,也永远不会退出
我尝试创建对runloop和websocket的外部引用:
async with \
aiohttp.ClientSession() as session, \
session.ws_connect(streams_url) as wsock, \
anyio.create_task_group() as tg:
ᬑ.wsock = wsock
ᬑ.loop = asyncio.get_event_loop()
…并修改我的终止函数:
def terminate(ᬑ):
# ᬑ.loop.stop()
asyncio.set_event_loop(ᬑ.loop)
async def kill():
await ᬑ.wsock.close()
asyncio.run(kill())
…但它不起作用
我现在无法重新构建整个应用程序以使用asyncio
如何打破循环?您应该使用
asyncio.wait\u for
或asyncio.wait
并调用wsock.\uu下一步()
直接代替async for
循环
带有asyncio.wait
的循环应该如下所示:
next\u message=asyncio.create\u任务(wsock.\uuuuuu anext\uuuu())
而不是self.terminate_标志:
wait asyncio.wait([next_message],timeout=SOME_timeout,)
如果下一个_消息.done():
尝试:
msg=next_message.result()
除停止异步迭代外:
打破
其他:
打印(消息数据)
下一条消息=asyncio.create_任务(wsock.\uuuu anext\uuuu())
某些\u超时应替换为您希望连续等待下一条传入消息的秒数
是asyncio.wait的文档
替换了p.S.I<代码>ᬑ用self
编码,但我希望你能明白