Python_学习_协程
成员:
coro
even_loop
task
async 标记一个协程对象 (可以理解为标记 这是一个协程对象 或者说协程对象带着这个标记) [.](async 标记一个生成器成为协程对象)
async 标记的协程对象是协程程序中最小的单位 被task包装
event_loop 是一个无限循环 [.](event_loop 是一个无限循环 用于添加task 当事件满足发生条件时,调用对应的task)
协程只能在事件循环中执行.
event_loop 是一个对象可以无限的创建。但是只能执行一个.
task是可执行的任务o
feture 代表将来执行或没有执行的任务的结果[.](它和task上没有本质的区别; 结果也是状态 其实就是yield 的返回值 退出了也是有返回值的 退出也是一个return)
feture 是一个可等待对象.
协程运行:
创建:
创建一个事件循环(Even_loop)对象 用于执行协程任务
Even_loop只有被线程调用的时候才能执行。不要使用get_event_loop创建于调用Even_loop 因为其带有复杂的行为
使用 new_event_loop 来new 一个event_loop 对象
使用set_event_loop 来为线程调用event _loop
使用 get_event_loop 来返回正在运行的event_loop
注册:
所有要调用的事件 [注册](task = loop.create_task(coro)) 在Event_loop 中才能被执行
调用 Event_loop中注册的事件 才能运行事件
调用运行:
低级:**loop.run_until_complete(task) 接受一个future 实例 **
高级:asyncio.run(coro)
集合调用:
因为调用运行支持的是一个实例 所以使用集合来调用多个任务
使用asyncio.run(main)
TODO
python3 异步 asyncio get_event_loop new_event_loop 使用
Record
async def Foo ():
...
if __name__ == "__main__":
loop = asyncio.new_event_loop() #New event loop object
gater = asyncio.gather(...)
loop.run_until_complete(gather)
exception:
loop argument must agree with Future
#new 一个事件循环对象 只是一个对象 并不能做什么 并且线程只能执行一个协程 创建一个对象 并且不是想传递而作为上下温使用用的时候 要使用 set_event_loop()将事件循环作为线程当前执行事件循环 并且运行时 事件循环就可以运行了 不然对象可以创建无数个 不可能全部无限运行。
async def bar():
...
if __name__ == "__main__":
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
gather = asyncio.gather(...)
loop.run_until_complete(gather)
code done
asyncio.gather(Coro1,Coro2,Coro3) 返回Feture Object 接受多个协程对象
*[1,2,3,4,5,6] --- > 1,2,3,4,5 解压列表
asyncio.wait(coro1,coro2,coro3) 只是等待 返回的是完成的与挂起的任务
#即 一个是future 一个是task
async def bar():
...
loop = asyncio.new_event_loop()
asyncio.set_even_loop(loop)
task=loop.creat_task(bar())
loop.run_until_complete(task)#接受一个futur 实例
TODO:
知乎
TODO:
get_future = asyncio.ensure_future(get_html("http://www.imooc.com")) #创建一个future对象
#新的python建议 改为creat_task(coro) 来代替 ensure_future
#将 coro 协程 打包为一个 Task 排入日程准备执行。返回 Task 对象。
协程运行的几种代码形式
最新的一种
import asyncio
import random
async def Print_Hello_World ():
await asyncio.sleep(3)
print("Hello World")
async def Print_HellO_word_1():
await asyncio.sleep(2)
print("Hello world")
async def main():
await asyncio.gather(Print_Hello_World(),Print_Hello_World_1())
# gather 返回的是Future对象 Future对象则是一个可等待对象
asyncio.run(main())
第二种
import asyncio
import random
async def Print_Hello_World(Pram):
await asyncio.sleep(Pram)
print("Hello world")
if __name__ == "__main__":
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
gather = ayncio.gather(*[Print_HellO_World(i) for i in range(10)])
loop.run_until_complete(gather)
loop.close()
#使用这种形式要注意 gather 包括了注册事件到event_loop 中的这个行为要是将gather 放到loop上的时候 就不会注册event_loop中
#就会报 loop argument must agree with Future 这个错误 没有set_event_loop 也是保这个错误
#协程是一种按照一种计划执行的程序 当打乱了计划就有可能无法执行了 计划或者叫方案是有先后的 要是不按照先后来执行
#是按照每一步计划协同搭配按照一定的方案策略组成一种想要的模型 就有点想机械的组合一样
何为协程:
描述:简述
微妙的行为组成
按照一种计划的配合 以一种微妙的方式达成一种特意的效果
以现有的方式与对象
对 对象以一种特定的行为 计划 达到一种特意 想要 的效果
这个对象这样做 那个对象这样做 然后按照方案组合在一起微妙达到想要的效果
特性:使用与理解
这是一种本质的行为不会超过其容量的一
其实就是说性能不好变好。只是换成了另外一种行为方式
能做的事情不会变的更多。还是0或者更低
本质上没变 只是换了一种行为
东西还是这些东西 物质没有发生变化 不像线程与进程这种是变了物质 协程只是变得更加配合好的行为
探究: 简化与优化
低级的协程都是一些设定
使用协程 是用现有的东西去配合 因为没有新的东西被创造出来的 所以肯定没有性能变化一说
本文地址:https://blog.csdn.net/qq_45079070/article/details/107476337
下一篇: 社科基金