我需要循环运行一个协程。
所以,我创建了一个新的循环,然后用asyncio.ensure_future(awatable, loop)
创建了一个任务,最后,我通过loop.run_forever(task)
在循环中运行了这个任务。
然而,当我启动脚本时,我收到一个错误,告诉我协程从未被等待过。这怎么可能呢?ensure_future()
的第一个参数是一个awaitable,不需要等待,对吗?此外,它告诉我我销毁了一个挂起的任务,但我有没有这样做?
代码
async def initiate_bot():
await bot.add_cog(my_commands.MusicBot(bot, prefix, float(volume), lyrics, bot_name, spotify_id, spotify_secret))
await bot.start(token)
# create loop
loop = asyncio.new_event_loop()
# create a task
task = asyncio.ensure_future(initiate_bot(), loop=loop)
try:
# task runs forever
loop.run_forever(task)
except KeyboardInterrupt:
pass
finally:
# stop and close loop
loop.stop()
sys.exit(0)
错误:
Task was destroyed but it is pending! task: <Task pending name='Task-1' coro=<initiate_bot() running at /home/[user]/Scrivania/Coding/[project name]/main.py:45>> sys:1: RuntimeWarning: coroutine 'initiate_bot' was never awaited
1条答案
按热度按时间5vf7fwbs1#
loop.run_forever()函数不接受任何参数。当您使用asyncio.ensure_future()时,您已经在计划任务的执行。
Python 3.7引入了一个新的辅助函数asyncio.run(),它可以自动创建和销毁异步事件循环。所以,你可以简单地将代码替换为: