簡體   English   中英

Asyncio 程序退出,盡管其中有一段時間 True 循環

[英]Asyncio program quits despite a while True loop in it

這段代碼在我啟動后幾乎立即結束。 這是出乎意料的,因為我在run() function 中有一個while True循環。

import asyncio

from binance import BinanceSocketManager
from binance.client import AsyncClient


class Portfolio:
    def __init__(self, async_client: AsyncClient = None):
        self._async_client = async_client
        self.coin_pos = []

    async def run(self):
        asyncio.create_task(self._future_account_listener())

        while True:
            print(f"# of updates: {len(self.coin_pos)}")
            await asyncio.sleep(10)

    async def _future_account_listener(self):
        bsm = BinanceSocketManager(self._async_client)
        async with bsm.futures_socket() as us:
            while True:
                msg = await us.recv()
                print(msg)


async def main():
    async_client = await AsyncClient().create(api_key=API_KEY, api_secret=API_SECRET)

    portfolio = Portfolio(async_client)
    asyncio.create_task(portfolio.run())

if __name__ == '__main__':  
    asyncio.run(main())

但是,如果我將if __name__ == '__main__':中的代碼替換為

loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()

代碼按預期運行。 我正在嘗試使用asyncio.run() ,因為文檔說這是在最新版本的 Python 中啟動主要 function 的首選方法。 我在這里做錯了什么? 還是我只需要使用舊的方法來啟動我的程序?

問題是您的main方法以調用asyncio.create_task(portfolio.run())結束。 這會創建一個新的 asyncio 任務,但它不會等待它,因此您的main方法會立即退出。

您需要告訴您的代碼等待portfolio.run完成。 您可以只使用await

async def main():
    async_client = await AsyncClient().create(api_key=API_KEY, api_secret=API_SECRET)

    portfolio = Portfolio(async_client)
    await portfolio.run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM