在Python中,async
和await
是一对配合使用的关键字,用于定义异步函数和在异步函数中等待其他异步操作完成,函数被async修饰,那他就变成一个协程,其可以暂停和恢复
并发 ,并行 ,协程 同步 异步 概念
并发指的是 一个 CPU 同时处理多个程序,但是在同一时间点只会处理其中一个。并发的核心是:程序切换。但是因为程序切换的速度非常快,1 秒钟内可以完全很多次程序切换,肉眼无法感知。
- 协程(Coroutine):协程是一种轻量级的线程,可以在执行过程中暂停并让出控制权,然后在需要时恢复执行
使用协程可以更有效地利用系统资源,避免线程切换的开销
并行指的是多个 CPU 同时处理多个程序,同一时间点可以处理多个。
同步:执行 IO 操作时,必须等待执行完成才得到返回结果。
异步:执行 IO 操作时,不必等待执行就能得到返回结果。
asyncio.create_task(coroutine)
总的来说,asyncio.create_task()
用于并发执行多个协程任务,而 asyncio.gather()
用于等待多个协程任务的全部完成,并且可以收集执行结果
asyncio.gather(*coroutines_or_futures, return_exceptions=False)
async关键字:
async用于定义一个异步函数,表明该函数是一个协程,可以在其中使用await关键字等待其他异步操作完成异步函数的执行不会阻塞事件循环,而是会立即返回一个协程对象。
await关键字:
await用于在异步函数内部等待其他协程执行完成,后面通常跟着一个需要等待的协程对象
当遇到await关键字时,事件循环会挂起当前的协程,并执行其他任务,直到等待的协程完成后才会恢复执行当前协程
例子
在Python中,async
和await
是一对配合使用的关键字,用于定义异步函数和在异步函数中等待其他异步操作完成
import asyncio
# 定义一个异步函数
async def greet(name):
print("Hello, " + name)
await asyncio.sleep(2) # 使用异步的sleep函数
print("Goodbye, " + name)
# 执行异步函数
async def main():
# 创建任务并发执行
task1 = asyncio.create_task(greet("码农"))
task2 = asyncio.create_task(greet("研究僧"))
# 等待所有任务完成
await asyncio.gather(task1, task2)
# 运行主函数
if __name__ == "__main__":
asyncio.run(main())
错误实例
代码 确实是异步的,因为它使用了 asyncio
和 await
,但任务的执行是顺序的,所以它看起来像是同步的行为。这是因为你使用了 await
一个接一个地等待每个任务完成,而不是并发运行多个任务。
import asyncio
# 定义一个异步函数
async def greet(name):
print("Hello, " + name)
await asyncio.sleep(2) # 模拟一个耗时的操作
print("Goodbye, " + name)
async def main():
await greet("码农")
await greet("研究僧")
# 运行主函数
if __name__ == "__main__":
asyncio.run(main())
原因
调用异步函数
在 Python 中,异步函数(async def
定义的函数)不能像普通函数一样直接调用,而是需要借助**事件循环(Event Loop)**来启动和运行。以下是启动异步函数的多种方式,以及详细的代码示例