python - 根据条件关闭 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 循环,但这不起作用,因为循环没有被打破。
解决方案
您可以使用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')
推荐阅读
- python - 如何优化此 Python 代码?
- php - 使用数据库登录 Symfony
- reactjs - 如何为 React Material UI 实现全局主题?
- javascript - javascript xmlhttprequest 总是获得状态 0
- c++ - c ++:为什么整数前面的减号信号会给出一个疯狂的数字?
- django - Django allauth 出错 is_safe_url() got an unexpected keyword argument 'allowed_hosts'
- c - STM32 VCP驱动——指针失效只有优化
- node.js - 列出应用的 sequelize 迁移
- python - 无法在 Windows 8.1 上安装 python-poppler-qt5
- ruby - 如何卸载 dart sass?