繁体   English   中英

试图了解如何在 Python 中使用多线程 websocket,但似乎卡在一个线程上

[英]Trying to understand how to use multithreaded websockets in Python but seem to be stuck with one thread

我有这个基本的交换监控脚本。 我试图为每个符号创建一个线程,除了处理其他工作的主线程,并让他们监听公共 Gemini websocket 端点。 我正在运行第一个线程并将交换数据打印到控制台,但不是第二个。 我曾期望看到来自两个线程的数据几乎同时打印。 我尝试使用线程库而不是 asyncio 并遇到了同样的情况。

我意识到我的两个公共 API MarketWebsocket 类可以组合起来更干净,我仍在尝试找到一种方法来轻松地将其他符号添加到列表中。 感谢您在正确方向上的任何推动!

import asyncio
from websockets import connect

symbols_to_watch = [
    "BTCUSD",
    "ETHUSD"
]

class BTCMarketWebsocket:
    disable = False

    async def __aenter__(self):
        symbol = symbols_to_watch[0]
        self._conn = connect("wss://api.gemini.com/v1/marketdata/{}".format(symbol))
        self.websocket = await self._conn.__aenter__()
        return self

    async def __aexit__(self, *args, **kwargs):
        await self._conn.__aexit__(*args, **kwargs)

    async def receive(self):
        return await self.websocket.recv()

class ETHMarketWebsocket:
    disable = False

    async def __aenter__(self):
        symbol = symbols_to_watch[1]
        self._conn = connect("wss://api.gemini.com/v1/marketdata/{}".format(symbol))
        self.websocket = await self._conn.__aenter__()
        return self

    async def __aexit__(self, *args, **kwargs):
        await self._conn.__aexit__(*args, **kwargs)

    async def receive(self):
        return await self.websocket.recv()

async def btcMarketWebsocket():
    async with BTCMarketWebsocket() as btcMarketWebsocket:
        while not btcMarketWebsocket.disable:
            print(await btcMarketWebsocket.receive())

async def ethMarketWebsocket():
    async with ETHMarketWebsocket() as ethMarketWebsocket:
        while not ethMarketWebsocket.disable:
            print(await ethMarketWebsocket.receive())

if __name__ == '__main__':
    asyncio.run(btcMarketWebsocket())
    asyncio.run(ethMarketWebsocket())

你可以做

async def multiple_tasks():
  Tasks =[] 
  Tasks.append(btcMarketWebsocket())
  Tasks.append(ethMarketWebsocket())
  await asyncio.gather(*Tasks, return_exceptions=True)
  

if __name__ == '__main__':
 asyncio.get_event_loop().run_until_complete(multiple_tasks())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM