> 文章列表 > 小黑继续跟着沛奇老师学携程:携程基础3

小黑继续跟着沛奇老师学携程:携程基础3

小黑继续跟着沛奇老师学携程:携程基础3

3.异步编程

3.1事件循环

理解成一个死循环,去检测并执行某些代码

# 伪代码任务列表 = [任务1,任务2,任务3,...]
while True:可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有任务,将'可执行'和'已完成'的任务返回for 就绪任务 in 可执行的任务列表:执行已就绪的任务	for 已完成的任务 in 已完成的任务列表:在任务列表中移除 已完成的任务
import asyncio# 去生成或获取一个事件循环
loop = asyncio.get_event_loop()
# 将任务放入到任务列表
loop.run_until_complete(任务)

3.2快速上手

协程函数,定义函数时候async def 函数名
协程对象,执行 协程函数()得到协程对象。

async def func():pass
result = func()

注意:执行协程函数创建协程对象
如果想要运行协程函数内部代码,必须要将协程对象交给事件循环来处理。

import asyncioasync def func():print('小黑想你啦!!!')result = func()
asyncio.run(result)

3.3 await关键字

await + 可等待对象(协程对象、Future、Task对象 -> IO等待)
示例1:

import asyncioasync def func():print('找小黑吃疯狂星期四啊!!')response = await asyncio.sleep(2)print('结束:', response)asyncio.run(func())

示例2:

import asyncioasync def others():print('start')await asyncio.sleep(2)print('end')return '返回值'async def func():print('执行协程函数内部代码')# 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其他协程(任务)response = await others()print('IO请求结束,结果为:', response)asyncio.run(func())

示例3

import asyncioasync def others():print('start')await asyncio.sleep(2)print('end')return '返回值'async def func():print('执行协程函数内部代码')# 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其他协程(任务)response1 = await others()print('IO请求结束,结果为:', response1)response2 = await others()print('IO请求结束,结果为:', response2)asyncio.run(func())

await就是等待对象的值得到结果之后再往下走。

3.4 Task对象

在事件循环中添加多个任务。
示例1:

import asyncioasync def func():print(1)await asyncio.sleep(2)print(2)return '返回值'async def main():print('main开始')# 创建Task对象,将当前执行func函数任务添加到任务循环中task1 = asyncio.create_task(func())# 创建Task对象,将当前执行func函数任务添加到任务循环中task2 = asyncio.create_task(func())print('main结束')# 当执行某协程遇到IO操作时,回自动化切换执行其他任务# 此处的await是等待相对应的协程全部执行完毕并获取结果ret1 = await task1ret2 = await task2print(task1, task2)if __name__ == '__main__':asyncio.run(main())

示例2:

import asyncioasync def func():print(1)await asyncio.sleep(2)print(2)return '返回值'async def main():print('main开始')task_list = [asyncio.create_task(func(), name='n1'),asyncio.create_task(func(), name='n2')]print('main结束')done, pending = await asyncio.wait(task_list, timeout=2)print(done, pending)
asyncio.run(main())

示例3:

import asyncioasync def func():print(1)await asyncio.sleep(2)print(2)return '返回值'task_list = [func(),func()
]
done, pending = asyncio.run(asyncio.wait(task_list))
print(done

小黑继续跟着沛奇老师学携程:携程基础3