首页 > 解决方案 > 异步 websocket 代码但一直以预期的方式工作?

问题描述

下面是获取加密刻度数据的非常简单的异步 websocket 示例(参考:https ://docs.upbit.com/docs/upbit-quotation-websocket ):

import websockets, asyncio, json


async def upbit_ws_client():
    uri = "wss://api.upbit.com/websocket/v1"

    async with websockets.connect(uri) as websocket:
        subscribe_fmt = [
            {"ticket": "test"},
            {"type": "ticker", "codes": ["KRW-BTC"], "isOnlyRealtime": True},
            {"format": "SIMPLE"},
        ]
        subscribe_data = json.dumps(subscribe_fmt)
        await websocket.send(subscribe_data)

        while True:
            data = await websocket.recv()
            data = json.loads(data)
            print(data)

async def main():
    await upbit_ws_client()

asyncio.run(main())

它运行起来就像一个魅力,从套接字获取数据并打印数据,但我很好奇在这里使用异步有什么好处?

当我运行此代码时,它只是按顺序“获取数据并打印”,就像同步方式一样。

为了以更清晰的方式检查它,我像这样更改循环中的代码并对其进行测试:

while True:
    data = await websocket.recv()
    data = json.loads(data)
    print(data)
    await asyncio.sleep(1)
    print("!")

结果:

{'ty': 'ticker', 'cd': 'KRW-BTC', 'op': 75688000.0, 'hp': 76370000.0, 'lp': 75036000.0, 'tp': 76154000.0, 'pcp': 75688000.0, 'atp': 237185412992.7991, 'c': 'RISE', 'cp': 466000.0, 'scp': 466000.0, 'cr': 0.0061568545, 'scr': 0.0061568545, 'ab': 'BID', 'tv': 0.01, 'atv': 3134.20326619, 'tdt': '20211016', 'ttm': '064940', 'ttms': 1634366980000, 'aav': 1773.47783911, 'abv': 1360.72542708, 'h52wp': 81994000.0, 'h52wdt': '2021-04-14', 'l52wp': 12893000.0, 'l52wdt': '2020-10-16', 'ms': 'ACTIVE', 'its': False, 'dd': None, 'mw': 'NONE', 'tms': 1634366981065, 'atp24h': 971024439526.2876, 'atv24h': 13063.39255463, 'st': 'REALTIME'}
!
{'ty': 'ticker', 'cd': 'KRW-BTC', 'op': 75688000.0, 'hp': 76370000.0, 'lp': 75036000.0, 'tp': 76154000.0, 'pcp': 75688000.0, 'atp': 237185972921.93796, 'c': 'RISE', 'cp': 466000.0, 'scp': 466000.0, 'cr': 0.0061568545, 'scr': 0.0061568545, 'ab': 'BID', 'tv': 0.00735259, 'atv': 3134.21061878, 'tdt': '20211016', 'ttm': '064940', 'ttms': 1634366980000, 'aav': 1773.47783911, 'abv': 1360.73277967, 'h52wp': 81994000.0, 'h52wdt': '2021-04-14', 'l52wp': 12893000.0, 'l52wdt': '2020-10-16', 'ms': 'ACTIVE', 'its': False, 'dd': None, 'mw': 'NONE', 'tms': 1634366981065, 'atp24h': 971024439526.2876, 'atv24h': 13063.39255463, 'st': 'REALTIME'}
!
...

结果始终按此顺序排列:

  1. 它从套接字接收数据
  2. 打印数据
  3. 睡眠 1 秒
  4. 打印 ”!”

我不明白为什么在这种情况下我们需要以异步方式编写代码,因为它一直以 1->2->3->4 的顺序工作(以阻塞方式)

标签: pythonasynchronouswebsocketpython-asyncio

解决方案


推荐阅读