概念
协程是轻量级的线程,它是程序员管理的并发机制,使得在一个线程中程序可以在多个函数之间交替运行。
Python中主要通过asyncio模块实现协程。
协程函数
用async
修饰的函数
import asyncio# func为协程函数
async def func():await asyncio.sleep(1)
协程对象
协程函数的调用结果 。
需要注意的是,此时并不会执行协程函数的内部代码。
# 协程对象
func()
可等待对象
被await
关键词修饰的对象,包括协程对象
, task对象
和future对象
。
创建协程
通过asyncio.run(协程对象)
方法运行协程函数时,协程之间是同步阻塞
的。
import asyncio
import timeasync def func(i):print(f'func {i} started...')await asyncio.sleep(2)print(f'func {i} ended...')print(time.strftime('%Y/%m/%d %H:%M:%S'))
asyncio.run(func(1))
asyncio.run(func(2))print(time.strftime('%Y/%m/%d %H:%M:%S'))
通过asyncio.create_task(协程对象)
方法运行多个协程函数时 ,协程之间是异步非阻塞
的。
import asyncio
import timeasync def func(i):print(f'func {i} started...')await asyncio.sleep(2)print(f'func {i} ended...')print(time.strftime('%Y/%m/%d %H:%M:%S'))async def main():task1 = asyncio.create_task(func(1))task2 = asyncio.create_task(func(2))await task2await task1asyncio.run(main())
print(time.strftime('%Y/%m/%d %H:%M:%S'))
简单等待
通过asyncio.wait(可等待对象,return_when=ALL_COMPLETED)
方法并发运行可等待对象,并进入阻塞状态直到满足return_when
指定的条件。
- 返回两个一个元组(done, pending)
- done代表完成的task集合
- pending代表未完成的task集合
- return_when表示wait函数啥时候返回结果
- FIRST_COMPLETED: 有一个可等待对象完成时
- FIRST_EXCEPTION: 有一个异常发生时
- ALL_COMPLETED: 所有可等待对象都完成时
import asyncio
import timeasync def say(greeting, seconds):await asyncio.sleep(seconds)print(greeting)async def main():say_hi = say('hi', 1)say_hello = say('hello', 2)task_hi = asyncio.create_task(say_hi)task_hello = asyncio.create_task(say_hello)print(time.strftime('%Y/%m/%d %H:%M:%S'))done, pending = await asyncio.wait([task_hi, task_hello])print(time.strftime('%Y/%m/%d %H:%M:%S'))print(done)asyncio.run(main())