python-3.x 协程需要在asyncio中等待,确保未来()- asyncio

zu0ti5jz  于 2023-04-22  发布在  Python
关注(0)|答案(1)|浏览(124)

我需要循环运行一个协程。
所以,我创建了一个新的循环,然后用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

5vf7fwbs

5vf7fwbs1#

loop.run_forever()函数不接受任何参数。当您使用asyncio.ensure_future()时,您已经在计划任务的执行。
Python 3.7引入了一个新的辅助函数asyncio.run(),它可以自动创建和销毁异步事件循环。所以,你可以简单地将代码替换为:

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)

asyncio.run(initiate_bot())

相关问题