python - aiohttp - 多个 websockets,单个 session ?

标签 python python-asyncio aiohttp

我越来越熟悉这些库,但我被以下情况难住了:

我希望持续处理来自两个不同网站的 websocket 的更新消息。

但我在使用单个 session 变量实现这一点时遇到了麻烦,因为 aiohttp.ClientSession() 对象应该存在于协程中。

import asyncio
import aiohttp

url1 = 'wss://example.com'

async def main():
    session = aiohttp.ClientSession()
    async with session.ws_connect(url1) as ws1:
        async for msg in ws1:
            # do some processing

loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()

以上将适用于单个 websocket 连接。但是因为 async for msg in ws: 是一个无限循环,所以我看不到可以把这个异步循环的 ws2 版本放在哪里。

最佳答案

由于每个 websocket 都需要自己的无限循环,因此您可以将其抽象为一个协程,为该 websocket 提供服务并接受来自其调用者的 session 。调用协程将使用 loop.create_task “在后台”创建服务任务,也可以从协程中调用它:

async def setup():
    session = aiohttp.ClientSession()
    loop = asyncio.get_event_loop()
    loop.create_task(serve(url1, session))
    loop.create_task(serve(url2, session))

async def serve(url, session):
    async with session.ws_connect(url) as ws:
        async for msg in ws:
            ...

loop = asyncio.get_event_loop()
loop.run_until_complete(setup())
loop.run_forever()

关于python - aiohttp - 多个 websockets,单个 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49150853/

相关文章:

python-3.x - 在后台同时运行 asyncio 任务

sqlalchemy - Gino引擎未初始化

python - aio_pika 的健壮连接未重新连接

Python:如何使用 asyncio 和巨大的 csv 文件从循环发送异步请求?

android - 如何在 flutter (android)应用程序中使用 C++ 代码?

python - 将 OpenCV 获取的图像保存到另一台计算机上(使用 FTP 或其他方式)

python-3.x - 理解 python 中的异步

python - 一起替换多个正则表达式模式

python - 如何使用 curses 删除行尾的文本

Python asyncio ensure_future 装饰器