Python 异步IO程序退出,尽管其中有一个while True循环

Python 异步IO程序退出,尽管其中有一个while True循环,python,python-asyncio,Python,Python Asyncio,这段代码在我启动后几乎立即结束。这是意外的,因为我在run()函数中有一个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

这段代码在我启动后几乎立即结束。这是意外的,因为我在
run()
函数中有一个
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())
但是,如果我将
中的代码替换为

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

代码按预期运行。我尝试使用
asyncio.run()
,因为文档中说,在最新版本的Python中,启动主函数是首选方法。我做错了什么?或者我必须使用较旧的启动程序的方法吗?

问题是您的
main
方法以调用
asyncio.create\u task(portfolio.run())
结束。这将创建一个新的asyncio任务,但它不会等待它,因此您的
main
方法将立即退出

您需要告诉您的代码等待
公文包。运行
以完成。您可以使用
wait

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

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

问题是您的
main
方法以调用
asyncio.create\u任务(portfolio.run())
结束。这将创建一个新的asyncio任务,但它不会等待它,因此您的
main
方法将立即退出

您需要告诉您的代码等待
公文包。运行
以完成。您可以使用
wait

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

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