Python中协程(coroutine)和生成器(generator)的区别 - Go语言中文社区

Python中协程(coroutine)和生成器(generator)的区别


协程和生成器都使用yield关键字。但是协程更像是对生成器语法的一些扩展

  • 在生成器中, yield 只对外产出值
  • 在协程中,yield能对外产出值,而且能接收通过send()方法传入值
下面是一段生成器的代码
def simple_generator():
  c = yield 1
  if c is None:
    print("c is None")

# 代码运行后,返回结果为
# generator = simple_generator()
# next(generator) -> 1
# next(generator) -> c is None

可以发现生成器语法中, generator不返回值。
上面的代码等价于

def simple_generator():
  yield 1
下面是一段协程的代码
def simple_coro2(a):
  print("->  Started: a =", a)
  b = yield a
  print("-> Received: b: =", b)
  c = yield a + b
  print("-> Received: c=", c)
当前代码的执行结果

可以看到在生成器中,每次调用send()方法时,yield语句对外返回yield右侧的值,再将输入的值赋值给左侧的变量。所以协程在yield上做了拓展。能接收一些参数

协程有四个状态

  • GEN_CREATED
  • GEN_RUNNING
  • GEN_SUSPEND
  • GEN_CLOSED

每个协程在使用时,必须进行初始化。否则抛出异常

TypeError: can't send non-None value to a just-started generator

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/5103c6a63e33
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:05:26
  • 阅读 ( 1341 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢