专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
51好读  ›  专栏  ›  Python开发者

Python 协程(1):yield 10 分钟入门

Python开发者  · 公众号  · Python  · 2017-07-07 17:01

正文

请到「今天看啥」查看全文


non - None value to a just - started generator


仔细看错误消息


can’t send non-None value to a just-started generator


最先调用next(my_coro) 这一步通常称为”预激“(prime)协程—即,让协程向前执行到第一个yield表达式,准备好作为活跃的协程使用。


再看一个两个值得协程


def simple_coro2 ( a ) :

print ( '-> coroutine started: a =' , a )

b = yield a

print ( '-> Received: b =' , b )

c = yield a + b

print ( '-> Received: c =' , c )

my_coro2 = simple_coro2 ( 14 )

print ( inspect . getgeneratorstate ( my_coro2 ))

# 这里inspect.getgeneratorstate(my_coro2) 得到结果为 GEN_CREATED (协程未启动)

next ( my_coro2 )

# 向前执行到第一个yield 处 打印 “-> coroutine started: a = 14”

# 并且产生值 14 (yield a 执行 等待为b赋值)

print ( inspect . getgeneratorstate ( my_coro2 ))

# 这里inspect.getgeneratorstate(my_coro2) 得到结果为 GEN_SUSPENDED (协程处于暂停状态)

my_coro2 . send ( 28 )

# 向前执行到第二个yield 处 打印 “-> Received: b = 28”

# 并且产生值 a + b = 42(yield a + b 执行 得到结果42 等待为c赋值)

print ( inspect . getgeneratorstate ( my_coro2 ))

# 这里inspect.getgeneratorstate(my_coro2) 得到结果为 GEN_SUSPENDED (协程处于暂停状态)

my_coro2 . send ( 99 )

# 把数字99发送给暂停协程,计算yield 表达式,得到99,然后把那个数赋值给c 打印 “-> Received: c = 99”

# 协程终止,抛出StopIteration


运行上述代码,输出结果如下


GEN_CREATED

-> coroutine started : a = 14

GEN_SUSPENDED

-> Received : b = 28

-> Received : c = 99

Traceback ( most recent call last ) :

File "/Users/gs/coroutine.py" , line 37 , in < module >

my_coro2 . send ( 99 )

StopIteration


simple_coro2 协程的执行过程分为3个阶段,如下图所示



  1. 调用next(my_coro2),打印第一个消息,然后执行yield a,产出数字14.

  2. 调用my_coro2.send(28),把28赋值给b,打印第二个消息,然后执行 yield a + b 产生数字42

  3. 调用my_coro2.send(99),把99赋值给c,然后打印第三个消息,协程终止。


使用装饰器预激协程


我们已经知道,协程如果不预激,不能使用send() 传入非None 数据。所以,调用my_coro.send(x)之前,一定要调用next(my_coro)。为了简化,我们会使用装饰器预激协程。


from functools import wraps

def coroutinue ( func ) :

'''

装饰器: 向前执行到第一个`yield`表达式,预激`func`

:param func: func name

:return: primer







请到「今天看啥」查看全文