首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何同时合并异步websockets的输出?

如何同时合并异步websockets的输出?
EN

Stack Overflow用户
提问于 2021-06-04 12:24:13
回答 1查看 276关注 0票数 0

问题

如何将两个或三个异步websocket结果的结果合并,由asyncio

  • I am库定义,使用websocket异步地下载密码货币的订单簿数据(有多少人想以这样的价格买卖),但很难显示几个硬币的结果。

  • 所需的输出示例如下,异步webscokets的每个输出(最低的要价)位于字典变量'output_dict‘:

中。

代码语言:javascript
运行
复制
output_dict
>>> {"XRP-BTC" : 0.00023, "ETH-BTC" : 0.04, "LTC-BTC" : 0.001}

  • 每个值都是websocket提供的最低的要价,所以我要做的是合并几个异步工作的webscoket的输出。

代码示例

代码语言:javascript
运行
复制
import asyncio
import websockets
import ast
import time
import json

# websocket address for the cryptocurrency exchange OKEx
url = "wss://ws.okex.com:8443/ws/v5/public"

# function to download orderbook data, using websocket asynchronously
async def ws_orderbook5(crypto_pair):
    while True:
            try:
                async with websockets.connect(url) as ws:
                    channels = [{'channel': 'books5', 'instId': f'{crypto_pair}'}]
                    sub_param = {"op": "subscribe", "args": channels}
                    sub_str = json.dumps(sub_param)
                    await ws.send(sub_str)
                    print(f"send: {sub_str}")
                    res = await asyncio.wait_for(ws.recv(), timeout=25)

                    while True:
                        try:
                            res = await asyncio.wait_for(ws.recv(), timeout=25)
                            res = ast.literal_eval(res) 
                            lowest_ask_price = res['data'][0]['asks'][0][0]
                            print(f"{crypto-pair} : Lowest ask price is {lowest_ask_price}")
                            
                            time.sleep(1)

                        except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed) as e:
                            try:
                                await ws.send('ping')
                                print("")
                                print("ping")
                                res = await ws.recv()
                                continue
                            except Exception as e:
                                print("Failure due to an unknown error. Stopped working")
                                break
            except Exception as e:
                print("Failure due to an unknown error. Try working again")
                continue

  • 变量res是从OKEx websocket下载的数据,当参数crypto_pair = 'XRP-BTC‘.

时,如下所示

代码语言:javascript
运行
复制
{'arg': {'channel': 'books5', 'instId': 'XRP-BTC'}, 
 'data': [{'asks': [['0.00002585', '4514.84', '0', '2'], 
                    ['0.00002586', '5845.946', '0', '5'],
                    ['0.00002587', '30306.155', '0', '5'], 
                    ['0.00002588', '9974.105', '0', '7'], 
                    ['0.00002589', '3104.84', '0', '5']], 
           'bids': [['0.00002582', '3988', '0', '2'], 
                    ['0.00002581', '23349.817', '0', '4'], 
                    ['0.0000258', '18735.565', '0', '8'], 
                    ['0.00002579', '6429.196', '0', '6'], 
                    ['0.00002578', '3492.795', '0', '5']], 
           'instId': 'XRP-BTC', 
           'ts': '1622805157064'}]
}

因此,在控制台上打印的

  • 如下所示。例如,这里的论点是"XRP-BTC“。

代码语言:javascript
运行
复制
XRP-BTC : The most favorable ask price is 0.00023

  • 我想要的输出是一个字典,它包含每对作为键的名称,最低的要价作为一个值。

代码语言:javascript
运行
复制
output_dict
>>> {"XRP-BTC" : 0.00023, "ETH-BTC" : 0.04, "LTC-BTC" : 0.001}

  • 能告诉我如何合并websockets的结果吗?
EN

回答 1

Stack Overflow用户

发布于 2021-06-04 19:39:34

您需要将您的协同线封装在一个任务中,每个货币对对应一个。

代码语言:javascript
运行
复制
loop = asyncio.get_event_loop()
loop.create_task(ws_orderbook5(pair1))
loop.create_task(ws_orderbook5(pair2))
loop.create_task(ws_orderbook5(pair3))
loop.run_forever()

要合并结果,可以将ws.recv()的结果添加到asyncio.Queue对象中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67837181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档