python - Websocket订阅和协同程序:在不退出循环的情况下提取消息?
问题描述
我正在尝试组织我对 API 的实时订阅,这就是我目前所拥有的:
async def real_time_info():
channels = ['channel1']
msg_subscription = msg.public_subscribe(channels)
async with websockets.connect(URL) as websocket:
await websocket.send(json.dumps(msg_subscription))
while websocket.open:
subscription = json.loads(await websocket.recv())
return subscription #HERE IS THE PROBLEM I'M TRYING TO SOLVE
async def real_time_data():
channels = ['channel2']
msg_subscription = msg.public_subscribe(channels)
async with websockets.connect(URL) as websocket:
await websocket.send(json.dumps(msg_subscription))
while websocket.open:
subscription = json.loads(await websocket.recv())
return subscription #HERE IS THE PROBLEM I'M TRYING TO SOLVE
async def main():
info = asyncio.create_task(real_time_info())
data = asyncio.create_task(real_time_data())
while True:
print(await info)
print(await data)
asyncio.run(main())
所以我想做的是每次有来自real_time_info()
or的消息时real_time_data()
,打印它。问题是因为我使用 return 它会自动退出该函数,当然也会停止从 websocket 获取消息。
从技术上讲,我可以通过将所有内容放在一个函数中并在其中完成所有内容而无需退出 for 循环来实现这一点,但是这样一来一团糟,而且很难管理我从套接字获取的消息。
有没有办法将这些套接字消息从我的real_time
函数中获取到 main,而它们仍然在循环中运行?
谢谢!
编辑:我还会问另一个关于 websockets 的问题,这些问题可能会使这一切变得微不足道。现在,我通过 2 个不同的函数连接到同一 API 的 2 个通道(通道 1 和通道 2)。但是因为在他们两个中我都尝试通过 读取来自服务器的消息await websocket.recv()
,这些消息是否仍然混合在同一个“接收器”中?如果是这样,有没有办法通过 websockets 管理来自服务器的响应?再次感谢。
解决方案
将 的实例传递asyncio.Queue()
给您的异步函数并替换return subscription
为await queue.put(('channel1', subscription))
. 然后你main
可以看起来像这样:
async def main():
queue = asyncio.Queue()
info = asyncio.create_task(quote_info(queue))
data = asyncio.create_task(trades_info(queue))
while True:
channel, subscription = await queue.get()
print(channel, subscription)
推荐阅读
- javascript - 在 React Native 中使用组件导入获取错误“元素类型无效预期字符串”
- html - 是否有任何维护良好的 Web 约束布局?
- android - 如何在安卓手机中小跑或设置网速?
- javascript - 将 [op.and] 添加到 Sequelize 查询对象
- java - 编写巨大的 excel 文件(20k 记录)需要超过 1 分钟的 java 时间?
- python - 尝试运行 python 代码(数组)时出现 SyntaxError
- java - 如何在 Braintree Android PayPal Vault Payment 上获取 PaymentMethodNonce 和 deviceData
- node.js - 尽管在 NodeJS 上使用 Passport 和 Express Session 成功注册,但 req.user 未定义
- ios - SwiftUI 日期格式化
- c# - 在 C# winform 中将数据库数据加载到 Checkedlistbox 时出现错误