在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中多线程的创建及基本调用方法
Jul 08 Python
python+opencv轮廓检测代码解析
Jan 05 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
python3实现名片管理系统
Nov 29 Python
python函数不定长参数使用方法解析
Dec 14 Python
Pytorch之Variable的用法
Dec 31 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
Python 没有main函数的原因
Jul 10 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 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
PHP可逆加密/解密函数分享
2012/09/25 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
TypeScript入门-接口
2017/03/30 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
js实现上传图片并显示图片名称
2019/12/18 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
幼儿园小班教师寄语
2014/04/03 职场文书
保险内勤岗位职责
2014/04/05 职场文书
热情服务标语
2014/10/07 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
祝酒词范文
2015/08/12 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers