两个带有 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。
你需要的是 运行 多个协程 使用 asyncio
的 ensure_future
模块,这将使你能够 安排任务和运行他们异步。
我们在下面的代码中所做的是,我们正在为 depth_socket
和 user_socket
创建单独的任务,这些任务会无限期地循环,但也会 运行 异步,因此它们可以 return服务器发送数据时无需等待其他任务完成。
我认为您遇到的问题是您试图将 depth_socket
和 user_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()
我正在尝试打开两个网络套接字 - 深度书套接字和用户套接字。
这是我的代码:
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。
你需要的是 运行 多个协程 使用 asyncio
的 ensure_future
模块,这将使你能够 安排任务和运行他们异步。
我们在下面的代码中所做的是,我们正在为 depth_socket
和 user_socket
创建单独的任务,这些任务会无限期地循环,但也会 运行 异步,因此它们可以 return服务器发送数据时无需等待其他任务完成。
我认为您遇到的问题是您试图将 depth_socket
和 user_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()