在python里使用await关键字来等另外一个协程的实例


Posted in Python onMay 04, 2020

一个协程里可以启动另外一个协程,并等待它完成返回结果,采用await关键字,

例子如下:

import asyncio
 
async def outer():
  print('in outer')
  print('waiting for result1')
  result1 = await phase1()
  print('waiting for result2')
  result2 = await phase2(result1)
  return (result1, result2)
 
async def phase1():
  print('in phase1')
  return 'result1'
 
async def phase2(arg):
  print('in phase2')
  return 'result2 derived from {}'.format(arg)
 
event_loop = asyncio.get_event_loop()
try:
  return_value = event_loop.run_until_complete(outer())
  print('return value: {!r}'.format(return_value))
finally:
  event_loop.close()

输出结果如下:
in outer
waiting for result1
in phase1
waiting for result2
in phase2
return value: ('result1', 'result2 derived from result1')

await关键字添加了一个新的协程到循环里,而不需要明确地添加协程到这个事件循环里。

补充知识:python里使用Condition对象来唤醒指定数量的协程

在asyncio库里,定义Condition对象,它的行为与事件Event有点像,区别是事件是通知所有对象,Condition对象可以指定一定数量的协程被通知,它是通过函数notify()来实现的,如果参数里放2,就是通知两个协程,例子如下:

import asyncio
 
async def consumer(condition, n):
  with await condition:
    print('consumer {} is waiting'.format(n))
    await condition.wait()
    print('consumer {} triggered'.format(n))
  print('ending consumer {}'.format(n))
 
async def manipulate_condition(condition):
  print('starting manipulate_condition')
 
  # pause to let consumers start
  await asyncio.sleep(0.1)
 
  for i in range(1, 3):
    with await condition:
      print('notifying {} consumers'.format(i))
      condition.notify(n=i)
    await asyncio.sleep(0.1)
 
  with await condition:
    print('notifying remaining consumers')
    condition.notify_all()
 
  print('ending manipulate_condition')
 
async def main(loop):
  # Create a condition
  condition = asyncio.Condition()
 
  # Set up tasks watching the condition
  consumers = [
    consumer(condition, i)
    for i in range(5)
  ]
 
  # Schedule a task to manipulate the condition variable
  loop.create_task(manipulate_condition(condition))
 
  # Wait for the consumers to be done
  await asyncio.wait(consumers)
 
event_loop = asyncio.get_event_loop()
try:
  result = event_loop.run_until_complete(main(event_loop))
finally:
  event_loop.close()

结果输出如下:

starting manipulate_condition
consumer 2 is waiting
consumer 3 is waiting
consumer 4 is waiting
consumer 1 is waiting
consumer 0 is waiting
notifying 1 consumers
consumer 2 triggered
ending consumer 2
notifying 2 consumers
consumer 3 triggered
ending consumer 3
consumer 4 triggered
ending consumer 4
notifying remaining consumers
ending manipulate_condition
consumer 1 triggered
ending consumer 1
consumer 0 triggered
ending consumer 0

以上这篇在python里使用await关键字来等另外一个协程的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
python3实现基于用户的协同过滤
May 31 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
python3.7 的新特性详解
Jul 25 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
Jan 14 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
Python 处理日期时间的Arrow库使用
Aug 18 Python
Python接口自动化测试的实现
Aug 28 Python
使用python实现学生信息管理系统
Feb 25 Python
python 异步async库的使用说明
May 04 #Python
Python插件机制实现详解
May 04 #Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 #Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 #Python
python3 sleep 延时秒 毫秒实例
May 04 #Python
Python并发concurrent.futures和asyncio实例
May 04 #Python
Python 中由 yield 实现异步操作
May 04 #Python
You might like
实用函数4
2007/11/08 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
深入研究React中setState源码
2017/11/17 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
Django如何实现内容缓存示例详解
2017/09/24 Python
详解Python的三种可变参数
2019/05/08 Python
Python3常见函数range()用法详解
2019/12/30 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
python opencv进行图像拼接
2020/03/27 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
携程英文网站:Trip.com
2017/02/07 全球购物
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
安全生产计划书
2014/05/04 职场文书
校园元旦活动总结
2014/07/09 职场文书
七一建党节演讲稿
2014/09/11 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
学生会干部任命书
2015/09/21 职场文书
OpenFeign实现远程调用
2022/08/14 Java/Android