两个带有 BinanceSocketManager 的 websockets

Two websockets with BinanceSocketManager

我正在尝试打开两个网络套接字 - 深度书套接字和用户套接字。

这是我的代码:

async def sockets(client):
    bm = BinanceSocketManager(client)
    ds = bm.depth_socket("BTCUSDT", depth=BinanceSocketManager.WEBSOCKET_DEPTH_5)
    
    print("Started...")

    async with ds as depth_socket:
        while True:
            res = await depth_socket.recv()
            print(res)

    await client.close_connection()

我需要同时打开 bm.user_socket() 个套接字。

如何使用 BinanceSocketManager 同时打开其中两个?

我修改了你的代码,因为它不起作用。我的感觉是您不太了解 asyncio 的工作原理。我建议您在 asyncio 事件循环中阅读此 tutorial

你需要的是 运行 多个协程 使用 asyncioensure_future 模块,这将使你能够 安排任务和运行他们异步

我们在下面的代码中所做的是,我们正在为 depth_socketuser_socket 创建单独的任务,这些任务会无限期地循环,但也会 运行 异步,因此它们可以 return服务器发送数据时无需等待其他任务完成。

我认为您遇到的问题是您试图将 depth_socketuser_socket 放在同一个 async 协程中,因此无限循环 depth_socket 意味着你永远不能同时循环 user_socket

教程 link 中有一节是关于 运行 多个协程的,我在上面给了你这帮助我理解了它是如何工作的。

不幸的是,我似乎无法连接到 binance 测试网,所以我无法测试 user_socket 任务是否在用户事件发生时真正起作用,但它应该不会抛出错误当连接到 livenet 时。如果您收到贸易活动,请告诉我。

您当然需要输入 api 密钥和密码。

import asyncio
from binance import AsyncClient, BinanceSocketManager

api_key = '...'
api_secret = '...'

async def task_depth_socket():
    client = await AsyncClient.create(api_key, api_secret)
    bm = BinanceSocketManager(client)
    ds = bm.depth_socket("BTCUSDT", depth=BinanceSocketManager.WEBSOCKET_DEPTH_5)

    async with ds as depth_socket:
        while True:
            res = await depth_socket.recv()
            print(res)
    
async def task_user_socket():
    client = await AsyncClient.create(api_key, api_secret)
    bm = BinanceSocketManager(client)
    us = bm.user_socket()
    
    async with us as user_socket:
        while True:
            res = await user_socket.recv()
            print(res)    
 
loop = asyncio.get_event_loop()

try:
    asyncio.ensure_future(task_depth_socket())
    asyncio.ensure_future(task_user_socket())
    loop.run_forever()

except KeyboardInterrupt:
    pass
finally:
    print("Closing Loop")
    loop.close()