Python asyncio.run() 错误:无法从正在运行的事件循环中调用

在 Python 异步编程中,当您遇到 'RuntimeError: asyncio.run() cannot be called from a running event loop' 错误时,这意味着您尝试在已存在的事件循环中调用 asyncio.run() 函数。

错误原因

asyncio.run() 函数用于运行 asyncio 协程,它会自动创建一个新的事件循环并在协程运行完毕后关闭该循环。如果您在已存在的事件循环中调用此函数,就会导致冲突并引发此错误。

常见情况和解决方法

以下是一些可能导致此错误的常见情况以及相应的解决方法:

  1. 多次调用 asyncio.run(): 确保在您的程序中只调用一次 asyncio.run()。如果您需要运行多个异步任务,可以使用 asyncio.gather()asyncio.wait() 将它们组合起来。

  2. 在已存在的事件循环中调用: 如果您已经有一个正在运行的事件循环,请使用 asyncio.get_event_loop() 获取当前事件循环对象,并使用该对象运行您的协程,例如使用 loop.run_until_complete(your_coroutine())

  3. 第三方库冲突: 一些第三方库可能在其内部使用事件循环,这可能与 asyncio.run() 冲突。在这种情况下: - 尝试手动创建和关闭事件循环。 - 查看库的文档以了解如何正确使用 asyncio。

示例代码

以下代码演示了如何在不引发错误的情况下使用 asyncio.run() 运行协程:pythonimport asyncio

async def my_coroutine(): # 执行一些异步操作 await asyncio.sleep(1) print('协程执行完毕')

def main(): # 检查当前是否有正在运行的事件循环 try: loop = asyncio.get_running_loop() except RuntimeError as e: loop = None

if loop and not loop.is_closed():        # 如果存在运行中的事件循环,则在该循环中运行协程        print('在当前事件循环中运行协程')        loop.run_until_complete(my_coroutine())    else:        # 否则,创建一个新的事件循环并运行协程        print('创建新的事件循环并运行协程')        asyncio.run(my_coroutine())

if name == 'main': main()

这段代码首先尝试获取当前正在运行的事件循环。如果存在并且未关闭,则在当前循环中运行协程;否则,将创建一个新的事件循环并在其中运行协程。这样可以有效避免 'RuntimeError: asyncio.run() cannot be called from a running event loop' 错误。

希望以上解释和示例代码能够帮助您解决此问题。如果您还有其他疑问,请随时提出。

Python asyncio.run() 错误:无法从正在运行的事件循环中调用

原文地址: https://www.cveoy.top/t/topic/cf9O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录