asyncio.run
, asyncio.run_coroutine_threadsafe
, loop.run_until_complete
, 和 create_task
是 Python asyncio 中用于管理协程的不同方法,它们在协程的执行和管理方式上有一些区别。
-
asyncio.run
:asyncio.run
是 Python 3.7+ 引入的,用于运行一个协程并等待其完成。- 它通常用于应用程序的主入口点,以便在应用程序中方便地运行一个协程。
- 它创建一个新的事件循环,运行协程,等待协程完成,然后关闭事件循环。
示例:
import asyncio async def main(): await asyncio.sleep(1) print("Hello, world!") asyncio.run(main())
-
asyncio.run_coroutine_threadsafe
:asyncio.run_coroutine_threadsafe
是用于在一个线程中安全地运行协程,并且可以从另一个线程提交协程进行执行。- 这在多线程环境下是有用的,可以安全地将协程任务提交给事件循环。
- 它返回一个 concurrent.futures.Future 对象,您可以使用
.result()
方法来等待协程的结果。 -
asyncio.run_coroutine_threadsafe
函数通常在多线程环境中使用,它会将协程提交到指定的事件循环(在本例中是loop
)中运行,并返回一个concurrent.futures.Future
对象。在代码中,使用future.result()
获取协程的结果,但可能因为线程同步的问题导致卡死。如果你在单线程环境中使用 asyncio,最简单的方式是使用
asyncio.run
来运行协程
示例:
import asyncio async def my_coroutine(): await asyncio.sleep(1) return "Hello, world!" async def main(): future = asyncio.create_task(my_coroutine()) result = await future return result if __name__ == "__main__": result = asyncio.run(main()) print(result)
-
loop.run_until_complete
:loop.run_until_complete
是 asyncio 事件循环对象的方法,用于运行一个协程并等待其完成。- 这个方法只能在事件循环的上下文中使用。
- 它会一直阻塞,直到协程执行完成,然后返回协程的结果。
示例:
import asyncio async def my_coroutine(): await asyncio.sleep(1) return "Hello, world!" loop = asyncio.get_event_loop() result = loop.run_until_complete(my_coroutine()) print(result)
-
create_task
:create_task
是 asyncio 事件循环对象的方法,用于将协程封装为一个任务对象并立即返回任务对象。- 任务是协程的包装器,它可以在后台并行执行,而不需要等待其完成。
- 通常用于同时启动多个协程任务。
示例:
import asyncio async def my_coroutine(task_name, seconds): await asyncio.sleep(seconds) return f"{task_name} completed after {seconds} seconds" async def main(): task1 = asyncio.create_task(my_coroutine("Task 1", 2)) task2 = asyncio.create_task(my_coroutine("Task 2", 1)) # 此处可以做其他事情,不需要等待任务完成 result1 = await task1 result2 = await task2 print(result1) print(result2) asyncio.run(main())
总结:
asyncio.run
用于运行一个协程并等待其完成,通常在应用程序的入口点处使用。asyncio.run_coroutine_threadsafe
用于在多线程环境中安全地运行协程,可以从不同的线程中提交协程进行执行。loop.run_until_complete
用于运行一个协程并等待其完成,通常在事件循环的上下文中使用。create_task
用于创建并行执行的任务,通常在需要同时启动多个协程时使用,然后您可以等待这些任务的完成。