小黑继续跟着沛奇老师学携程:携程基础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 asyncio

async def func():
    print('小黑想你啦!!!')

result = func()
asyncio.run(result)

3.3 await关键字

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

import asyncio

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

asyncio.run(func())

示例2:

import asyncio

async 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 asyncio

async 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 asyncio

async 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 task1
    ret2 = await task2
    print(task1, task2)

if __name__ == '__main__':
    asyncio.run(main())

示例2:

import asyncio

async 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 asyncio

async 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_第1张图片

你可能感兴趣的:(小黑跟着沛奇老师的协程学习,python,开发语言)