如何打破(异步)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_函

此代码打印来自websocket连接的所有消息:

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
编码,但我希望你能明白