簡體   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