python记录运行时间_python-关于协程的几点记录

名词定义

任务:协程对象注册到事件循环后,y策略,执行函数中的操作; 任务的创建依赖已经启动的事件循环 loop.create_task(协程)

future:等价于任务,未完成的任务 ,通过asyncio.ensure_future(协程) 进行任务创建 Task是Future的子类

事件: event_loop, 启动事件循环,确保协程对象注册到事件循环,完成到任务的转化(任务状态:pending、running、done、cancel),await:等待任务结束

协程:Python的功能间切换着执行. 切换的点用 await 来标记使用async关键词将其变成协程方法,比如async def function():。其中,async 定义一个协程,await 用来挂起阻塞方法的执行

实践结论

先将task列表传入asyncio.gather()或 asyncio.wait()在传入run_until_complete中,比直接将task列表传入run_until_complete速度更快(即使task里面已经使用await进行等待任务):任务粒更细粒度化asyncio.gather(*tasks) 一定程度上等价于asyncio.wait(*tasks) , 但是:gather的入参为task,且*后携带的是可迭代的task列表;wait入参为future ;任务的工作流程:启动事件循环->协程方法注册到事件循环,封装成task->执行到await,释放cpu占用切给其他task,自己等待依赖的其他资源就绪->经过不固定CPU时间片,直到run_until_complete任务完成,拿到返回结果

典型的协程Demo

main方法中流程

loop = asyncio.get_event_loop()

tasks = [协程方法] # 将协程对象封装成任务对象

loop.run_until_complete(asyncio.gather(*tasks))

loop.close()

具体的代码示例如下:

fc1f4134970a304e0e395d953f2a7282c8175ca9.png?token=937a4b6da0a53a633dbf762380b0b4f2&s=1EAA702319BEE5CC5C7444DA0300C0B1

回调函数:

协程定义函数funA

正常定义回调函数call_back_B

等任务A执行完,执行B

async def funA():

...

def call_back_B(task):

return task.result()

在main方法流程:

task = asyncio.ensure_future(协程)

task.add_done_callback(call_back_B)

loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.wait(task))

loop.close

7e3e6709c93d70cfa3bcc2510d3e0404bba12b0b.png?token=262fffd258a012756f946b3c2384b244&s=1EAA742399BFC1CC1AF5A1DB030080B1

多线程组合协程

主要用到concurrent.futrue.ThreadPoolExecuto线程池

创建Future对象:loop.run_in_executor(协程,pool)

async def funC():with concurrent.futures.ThreadPoolExecutor(max_workers = 10) as executor: loop = asyncio.get_event_loop() futures = ( loop.run_in_executor( executor, get_title, # 具体的操作 可以是协程也可以普通的函数 i) # i 为get_title的入参 for i in range(10) ) await asyncio.gather(*futures)

在main方法中流程:

loop = asyncio.get_event_loop()res = loop.run_until_complete(asyncio.gather(main()))

eac4b74543a98226f9bb14a860606c054b90eb2a.jpeg?token=59faceb19c3dde31594da5915b5dfa8b&s=C210EE23702042AEAAF5A9D3010080B2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值