首页 > 解决方案 > 根据条件关闭 Python 中的任务

问题描述

我正在使用 AsyncIO 和 Websockets 模块在 Python 中创建两个并发任务,每个任务都连接到 websocket 服务器并接收消息。

我正在尝试创建一个系统,当一个任务超过 4 秒没有收到消息时,它必须关闭连接和任务,但我很难弄清楚这一点。谁能帮我解决这个问题?

这是我尝试过的:

async def connect(URI):
    async with websockets.client.connect(URI) as ws:
        LastUpdate = time.time()
        while time.time() - LastUpdate < 4:
            LastUpdate = time.time()
            await ws.recv()

        print('Not receiving updates anymore')
                
async def main():
    Tasks = [asyncio.create_task(connect('URI1')), asyncio.create_task(connect('URI2'))]

    await asyncio.gather(*Tasks)

在这里,main创建两个并发任务并运行它们。connect负责连接和接收消息。我试图做的是在最后一次更新超过 4 秒前打破 while 循环,但这不起作用,因为循环没有被打破。

标签: pythonpython-3.xwebsocketpython-asyncio

解决方案


您可以使用asyncio.wait_for

async def connect(URI):
    async with websockets.client.connect(URI) as ws:
        while True:
            try:
                msg = await asyncio.wait_for(ws.recv(), 4)
            except asyncio.TimeoutError:
                break
            # do something with msg

        print('Not receiving updates anymore')

推荐阅读