Python 如何从多个websocket流中提取数据以在公式中使用?

Python 如何从多个websocket流中提取数据以在公式中使用?,python,websocket,async-await,python-asyncio,Python,Websocket,Async Await,Python Asyncio,以下代码试图从“连接”集中获取流消息。我试图找出如何提取两个浮点值——每个流一个——来计算商。聚合的流消息看起来无序且不连续,如果我声明全局变量并尝试以迭代方式填充它们,我的例程就会暂停。我希望能够连接到多个流,并使用消息数据生成实时计算值/结果。如果可以的话,请帮忙。我不熟悉python和asyncio 代码如下: import asyncio import websockets import json connections = set() connections.add("my

以下代码试图从“连接”集中获取流消息。我试图找出如何提取两个浮点值——每个流一个——来计算商。聚合的流消息看起来无序且不连续,如果我声明全局变量并尝试以迭代方式填充它们,我的例程就会暂停。我希望能够连接到多个流,并使用消息数据生成实时计算值/结果。如果可以的话,请帮忙。我不熟悉python和asyncio

代码如下:

import asyncio
import websockets
import json

connections = set()
connections.add("mystream1")
connections.add("mystream2")

async def handle_socket1(url):
    async with websockets.connect(url) as websocket1:
        async for message in websocket1:
            json_msg = json.loads(message)
            if json_msg["X"] == "A":
                value1 = float(json_msg["b"])
            if json_msg["Y"] == "B":
                value2 = float(json_msg["a"])
            print(value2/value1)

async def handler1():
    await asyncio.wait([handle_socket1(url) for url in connections])

您可以将这两个流都导入一个队列,并使用一个单独的函数从队列中提取任一值并重新计算商:

async def handle_stream(url, identifier, queue):
    async with websockets.connect(url) as websocket1:
        async for message in websocket1:
            json_msg = json.loads(message)
            await queue.put((identifier, json_msg["value"]))

async def calculate(queue):
    value_a = value_b = None
    while True:
        identifier, value = await queue.get()
        if identifier == 'A':
            value_a = value
        else:
            value_b = value
        if value_a is not None and value_b is not None:
            print(value_a / value_b)

async def main():
    queue = asyncio.Queue()
    await asyncio.gather(
        handle_stream("mystream1", "A", queue),
        handle_stream("mystream2", "B", queue),
        calculate(queue),
    )

您发布的代码是从单个流计算商。您想如何计算两条不同溪流的商?您想将一个流中的
json_msg[“a”]
与另一个流中的
json_msg[“b”]
分开吗?或者,当一个值从一个流中到达,但(尚未)从另一个流中到达时,会发生什么情况:是否应立即重新计算商,或者代码应该等待新值到达两个流中吗?我想这解释了为什么我总是为其中一个流值得到0!理想情况下,我希望同时连接到两个流,然后使用来自每个最新流的一段数据计算最新的商。我想不断刷新商数,就好像它是一个活值一样。谢谢!我想我们离我需要的越来越近了。我一定是做错了什么,因为当我运行你的代码时,即使我在我的所有流、键和值中进行了sub操作,也不会发生任何事情。为了澄清:我需要将B除以A,其中A是stream1中的值,其中key=X,B是stream2中的值,其中key=Y。另外,我对一些变量有点模糊:queue/identifier/json_msg[“value”](在handlestream中)和value(在calculate中)。为我的python新手提前道歉。顺便说一句,我在各地测试了打印报表,但没有结果。奇怪。@Query13如果没有输出,那么我想安装程序可能失败了。原始代码运行了吗?至于变量,我不确定你的问题是什么。变量名是否令人困惑,或者您是否不理解不同函数中变量的用途?您了解队列(有时也称为通道)在编程中的作用吗?是的,原始代码工作正常。我以你为例,从头开始逐行添加,看看问题出在哪里。我再转回来。谢谢,谢谢你,用户4815162342。我根据您建议的代码生成了所需的结果。如果您感兴趣,我已经发布了另一个关于当我Ctrl+C退出循环时返回的异常的问题。