浅析python协程相关概念


Posted in Python onJanuary 20, 2018

这篇文章是读者朋友的python协程的学习经验之谈,以下是全部内容:

协程的历史说来话长,要从生成器开始讲起。

如果你看过我之前的文章python奇遇记:迭代器和生成器 ,对生成器的概念应该很了解。生成器节省内存,用的时候才生成结果。

 

# 生成器表达式
a = (x*x for x in range(10))
# next生成值
next(a()) # 输出0
next(a()) # 输出1
next(a()) # 输出4

与生成器产出数据不同的是,协程在产出数据的同时还可以接收数据,具体来说就是把yield 放在了表达式的右边。我们可以使用.send() 把数据发送给协程函数。

def writer():
  print('-> coroutine started')
  for i in range(8):
    w = yield
    print(i+w)

w = writer()
# 本质还是生成器
>>> w
<generator object writer at 0x000002595BC57468>
# 首先要用next()把协程激活
>>> next(w)
-> coroutine started
# 发送数据
>>> w.send(1)
1
# send到第八次之后会抛出异常
# 因为协程已经结束了
---------------------------------------------------------------------------
StopIteration               Traceback (most recent call last)

第一步必须使用next() 激活协程函数,这样才能在下一步使用.send() 发送数据。

可以看到,在第8次接收完数据之后,会产生结束的异常,因为程序流程结束了,这是正常现象。加个异常处理即可。如果需要在两个协程间传递数据呢?

def writer():
  while True:
    w = yield
    print('>>', w)

def writer_wrapper(coro):
  # 激活
  next(coro)
  while True:
    # 异常处理
    try:
      x = yield
      # 发送数据给writer
      coro.send(x)
    except StopIteration:
      pass
w = writer()
wrap = writer_wrapper(w)
# 激活
next(wrap)
for i in range(4):
  wrap.send(i)
# 输出
>> 0
>> 1
>> 2
>> 3

上面的代码中,数据首先传递到writer_wrapper,之后再传递到writer 。

data——>writer_wrapper——>writer

可以这么写,不过,又要预先激活,又要加异常,看起来有点麻烦啊。yield from 的出现可以解决这个问题,同样是传递数据:

def writer():
  while True:
    w = yield
    print('>>', w)
def writer_wrapper2(coro):
  yield from coro

一行代码解决问题。

总之,yield from相当于提供了一个通道,使得数据可以在协程之间流转 。writer_wrapper2 中使用yield from coro时,coro此时获得控制权,在我们.send() 数据时,writer_wrapper2 被阻塞,直到writer 打印出结果。

在这个阶段,协程本质上还是由生成器构成的。

即使我们使用yield from 简化了流程,协程和生成器的知识理解起来还是有点懵逼,而且yield from 用在异步编程中有诸多不顺(asyncio以前就是用yield from),于是在3.5版本的python中,弃用了yield from ,新加入了两个关键字async 和await ,同时协程不再是生成器类型,而是原生的协程类型。

现在我们定义一个协程要像下面这样:

async def func():
  await 'some code'

不用于异步的协程该怎么用,我还不知道。所以,协程的介绍到这里就结束啦。感谢你对三水点靠木的支持。

Python 相关文章推荐
python进阶教程之异常处理
Aug 30 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
Python:slice与indices的用法
Nov 25 Python
Python龙贝格法求积分实例
Feb 29 Python
解决reload(sys)后print失效的问题
Apr 25 Python
python自动化测试之Selenium详解
Mar 13 Python
Python实现可自定义大小的截屏功能
Jan 20 #Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 #Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 #Python
Python搭建FTP服务器的方法示例
Jan 19 #Python
python re模块findall()函数实例解析
Jan 19 #Python
Python enumerate索引迭代代码解析
Jan 19 #Python
5个很好的Python面试题问题答案及分析
Jan 19 #Python
You might like
php获取操作系统语言代码
2013/11/04 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
如何快速上手Vuex
2017/02/14 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
解析Python中的异常处理
2015/04/28 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
Python多项式回归的实现方法
2019/03/11 Python
创建Django项目图文实例详解
2019/06/06 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
python中wheel的用法整理
2020/06/15 Python
中学生学习生活的自我评价
2013/10/26 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
公司授权委托书范本
2014/09/18 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
老员工辞职信范文
2015/05/12 职场文书
金陵十三钗观后感
2015/06/04 职场文书