Python-Asyncio异步编程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 = [
]
# 创建事件循环对象,或者说⽣成、获取⼀个事件循环
loop = _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 = _event_loop()
loop.run_until_complete(result)
"""
# 第⼆种运⾏⽅法
"""
# 创建⼀个新事件循环对象loop
loop = w_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
# 结束 Noneawait和async使用方法
# 主循环退出
"""
在内部先执⾏第⼀个print函数
如果内部还有其他的函数,那么就会执⾏其他的函数
如果其他的都执⾏完了,还是⼀直会执⾏事件循环
直到检测到这个⽹络请求结束
然后往下继续执⾏
当所有的事件都执⾏结束之后,那么就会退出整个事件循环
顺着执⾏主线程⾥⾯的代码
当主线程⾥⾯的代码执⾏完毕,然后退出整个线程
"""
6、await⽰例
import asyncio
async def other():
print('other start')
await asyncio.sleep(2)
print('other end')
return 'return from other async function'
async def main():
print('main start')
res = await other()
print(res)
print('main end')
asyncio.run(main())
# main start
# other start
# 2 秒之后同时打印
# other end
# return from other async function
# main end
7、task对象以及其创建
"""
task对象:
⽩话:在对象中添加多个任务的
官⽅:Task⽤于’并发’调度协调,通过ate_task(协程对象)的
⽅式创建task对象,这样可以让协程加⼊事件循环中等待被执⾏,此外,还可以调⽤底层的ate_task()函数,或者sure_future()
函数来实例化task对象,但是不建议这样⼿动去创建。
"""
import asyncio
async def func():
print('func begin')
await asyncio.sleep(2)
print('func end')
return 'return from func'
async def main():
print('main begin')
# 创建task任务,将当前func函数添加到事件循环
# 但是并不会执⾏函数,main函数还没有执⾏完毕
task1 = ate_task(func())
task2 = ate_task(func())
print('main end')
# 当执⾏某协程遇到io操作时,会⾃动化的切换到其他的任务
# 此处的await就是等待相应的协程结束并且获得相应的结果
# main函数遇到task阻塞
ret1 = await task1
ret2 = await task2
print(ret1, ret2)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。