1、协程
"""
协程:
协程在计算机中不是真实存在的,不是计算提供的
而是程序员人为创造的
是一个用户态上下文切换,或者一个微线程
简而言之,就是通过一个线程来实现代码之间的相互切换
实现协程的几种方法
greenlet,早期的模块
通过yield关键字来实现
python3 的内置模块 asyncio
通过 async 关键子 (p3.5),最主流的
协程的意义:
当遇到io阻塞时,会自动切换到另一个任务,而不是一直在原来的地方等待
提高了程序的执行效率
"""
def fun1(): pass
def func2(): pass
fun1()
func2()
# 一般来说,先执行func1,然后执行func2
# 但是协程可以在两者之间相互切换
2、asyncio里面的事件循环
"""
异步编程,
事件循环,就是一个死循环
这一个死循环会检测并且实行某些代码
有一个任务列表,在每一次循环的时候都会检测事件的状态
如果事件为可执行,
那么这个事件就会放到可执行列表(pending)
然后遍历可执行代码
如果执行完成了,那么就会放到完成事件的列表
之后遍历其中任务,或者以其他的方式处理(full filled)
"""
3、快速上手一个异步编程
import asyncio
async def func1():
print(1)
# 模拟网络请求,例如下载一张图片
await asyncio.sleep(2)
print(2)
async def func2():
print(3)
await asyncio.sleep(1)
print(4)
# 创建任务
tasks = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
# 创建事件循环对象,或者说生成、获取一个事件循环
loop = asyncio.get_event_loop()
# 将任务放到事件循环列表,然后去检测这些任务的状态
loop.run_until_complete(asyncio.wait(tasks))
# ---> 1, 3, 4, 2
4、协程函数和协程对象,以及运行方法
"""
协程函数,
定义函数的时候通过
async def function(): pass 定义的函数
协程对象:
执行 '协程函数()' 得到的返回的结果
result = function()
注意:执行协程函数内部的协程对象代码是不会执行的,只是生成一个协程对象而已
必须要添加到事件循环中才可以执行
"""
import asyncio
# 定义一个协程函数
async def func():
print('11111')
# 创建一个协程对象,此时内部的代码是不会执行的
result = func()
# 第一种运行方法
"""
# 通过这种方法运行会的到一个警告:
# 说获取不到事件循环对象,但是代码可以执行
loop = asyncio.get_event_loop()
loop.run_until_complete(result)
"""
# 第二种运行方法
"""
# 创建一个新事件循环对象loop
loop = asyncio.new_event_loop()
# 将事件循环对象设置到asyncio中
asyncio.set_event_loop(loop)
# 将协程对象添加到事件循环loop 中
loop.run_until_complete(result)
"""
# 第三种运行方法
# 本质上是对第二种运行方法的一种封装,让代码更加简单
asyncio.run(result)
5、await关键字
"""
await: (async wait),就是等,有了结果才继续往下执行
后面必须要跟着可等待的对象
内部可以有多个await对象
python中的可等待对象(可以理解为io等待)
1、协程对象 async def function()
2、Future对象
3、Task对象
"""
import asyncio
async def fun():
print('hello world')
# 假设此时此刻发送了一个网络请求, res 表示网络请求的结果
res = await asyncio.sleep(2)
print('结束', res)
asyncio.run(fun())
print('主循环退出')
# hello world
# 结束 None
# 主循环退出
""&#