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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数。yield在协程中的用法:在协程中yiel...
    JokerW阅读 1,899评论 0 0
  • 在此处先列下本篇文章的主要内容 简介 next方法的参数 for...of循环 Generator.prototy...
    醉生夢死阅读 1,490评论 3 8
  • Coroutine in Python 引言: 本文出自David Beazley 的关于协程的PPT,现在笔者将...
    LumiaXu阅读 1,745评论 4 8
  • 老秀才挪到这家百货店的第一级台阶上时,再也挪不动了。他太老了! 他不是去买东西,他太老了,只要有口饭吃,什么都不需...
    键盘上的狗狗阅读 401评论 0 2
  • 这是大刘的一个短篇故事,以混沌理论为基础。大刘的其他文章都没有《三体》那么出名,也没有那么宏大的架构,但毕竟是资深...
    chaos_theory阅读 2,345评论 1 2

友情链接更多精彩内容