asyncio异步编程
- event_loop 事件循环:相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足条件时,就会调用对应的处理方法。
- coroutine 协程:协程对象,只一个使用async关键字定义的函数,他的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环中,由事件循环调用。
- task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程的进一步封装,其中包含任务的各种状态。
- future:代表将来执行或没有执行的任务结果。它与task没有本质的区别。
- async/await 关键字:python3.5用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。
事件循环
event_loop 事件循环:相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足条件时,就会调用对应的处理方法。
理解成为一个死循环,去检测并执行某些代码。
import asyncio
# 生成或获取一个事件循环
loop = asyncio.get_event_loop()
# 将任务放到任务列表
loop.run_until_complete(任务)
async协程函数、协程对象
async def 函数名: 这种格式的函数,我们就称之为协程函数。
async def fun():
pass
执行协程函数() 得到的就是协程对象
result = fun() # 协程对象
注意:协程函数内部代码不会执行,只是得到一个协程对象
执行协程函数,需要与事件循环结合
如果需要执行协程函数内部代码,必须将协程对象交给事件循环处理。
import asyncio
async def fun():
print(1)
result = fun()
# loop = asyncio.get_event_loop()
# loop.run_until_complete(fun())
# loop.run_until_complete(result)
asyncio.run(result) #py3.7
asyncio.run(result) = loop = asyncio.get_event_loop() loop.run_until_complete(fun())
await
await 就是等待对象的值得到结果之后,才继续往下执行;等待期间可以执行其他任务
await + 可等待对象(协程对象、Future、Task对象),简单理解就是 IO等待
import asyncio
async def func():
print('start')
response = await asyncio.sleep(2)
print('end', response)
async def func1():
print('func1')
asyncio.run(func())
一个协程函数里可以有多个await
import asyncio
async def func():
print('start')
await asyncio.sleep(2)
print('end')
return 'gg'