python - 异步 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 秒
- 打印 ”!”
我不明白为什么在这种情况下我们需要以异步方式编写代码,因为它一直以 1->2->3->4 的顺序工作(以阻塞方式)
解决方案
推荐阅读
- php - 确认短信上的电话预览 URL:生成假验证/PHP
- reactjs - React Native 事件不会触发
- java - 具有 ElasticSearch 反应式流的 Spring Boot 应用程序的架构
- reactjs - 将参数传递给 React Apollo 突变
- html - 我可以在 SVG defs 块中使用 Angular 属性绑定吗?
- reactjs - React-Redux:onClick 函数不起作用说“this.props.selectDog 不是函数”
- sql-server - VB.net 中的 datagridview 列
- ruby-on-rails - 设计 configure_permitted_parameters 不允许 :avatar 变量
- couchbase - Couchbase 上的索引未启动
- c# - 如何返回多个元素列表?