尽管有一段时间的 True 循环,Asyncio 程序还是退出了
Asyncio program quits despite a while True loop in it
这段代码在我启动后几乎立即结束。这是意外的,因为我在 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())
但是,如果我将 if __name__ == '__main__':
中的代码替换为
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
代码按预期运行。我正在尝试使用 asyncio.run()
,因为文档说这是在最新版本的 Python 中启动主要功能的首选方法。我在这里做错了什么?还是我只需要使用旧方法启动我的程序?
问题是您的 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()
这段代码在我启动后几乎立即结束。这是意外的,因为我在 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())
但是,如果我将 if __name__ == '__main__':
中的代码替换为
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
代码按预期运行。我正在尝试使用 asyncio.run()
,因为文档说这是在最新版本的 Python 中启动主要功能的首选方法。我在这里做错了什么?还是我只需要使用旧方法启动我的程序?
问题是您的 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()