python中的asyncio使用详解与异步协程的处理流程分析
发布网友
发布时间:2024-10-04 16:06
我来回答
共1个回答
热心网友
时间:2024-10-24 07:48
一些核心概念
异步函数的定义
普通函数通过使用 def 关键词定义,而异步函数,即协程函数 (Coroutine) 是一种特殊类型的函数,可以在代码块中将执行权交予其他协程。定义时使用 async def 关键词。
如何调用协程并获得结果
调用普通函数如 result = add2(2) 可直接运行并返回结果4。然而,调用 result = add3(2) 会返回一个协程对象,而非结果2+3=5。要获得结果,需将协程放置于事件循环中执行。
事件循环 Eventloop
Eventloop 是 asyncio 应用的核心,它注册并循环执行异步函数。在执行过程中,遇到需要等待的 I/O 操作(如网络请求)时会暂停执行,切换到其他函数。这使得多个异步函数可以协同运行。
得到协程执行结果
要得到协程函数的结果,必须先创建一个 Eventloop 或者在调用协程时使用 await 关键字。例如,result = await add3(2)。await 只能在协程函数中使用。
复杂协程执行示例
通过将两个协程放在 main 函数中,事件循环会按顺序执行它们,即便两个协程内部有不同等待时间。要使协程并行执行,需要使用 asyncio.gather() 函数。
使用 asyncio.gather() 和 Task 任务对象
通过 asyncio.gather() 可以并行执行多个协程函数,返回结果是一个列表。使用 Task 对象如 asyncio.ensure_future() 或 loop.create_task() 可动态添加协程到事件循环。
异步函数与同步函数的执行
创建 task 对象并使用 loop.run_until_complete() 可以运行协程函数。同时,可以为 task 对象添加回调方法,当协程执行结束时调用事件循环的 stop 方法来结束整个循环。
并行执行多个协程
使用 asyncio.gather() 函数可以轻松并行执行多个协程,并通过调用 await asyncio.gather(*) 获取所有结果。
异步与多线程的结合
在事件循环中动态添加同步函数可以通过子线程运行事件循环并使用 loop.call_soon_threadsafe() 方法添加函数。为了实现并发执行,可以使用 run_in_executor() 方法在执行器中执行同步函数。
执行器的选择
使用 concurrent.futures 下的 ThreadPoolExecutor 或 ProcessPoolExecutor 可在多线程或多进程中执行同步函数。注意它们在初始化时的 max_workers 参数决定执行器的工作线程数。
异步函数的动态添加
使用 asyncio.run_coroutine_threadsafe() 可以将协程绑定到事件循环上,避免阻塞主线程。通过 gather() 方法结合 run_coroutine_threadsafe() 和 run_in_executor() 获得多个协程的结果。
获取协程结果
使用 asyncio.gather() 可以并行获取多个协程的结果。注意,获取结果时协程所在的线程与主线程可能不同,这取决于事件循环的运行方式。
异步库与实践
总结了异步协程的基本概念与流程后,接下来可以进一步学习与实践如 aiohttp 等与异步相关的库与框架,深入理解异步编程的威力。