协程,又称微线程,纤程,英文名Coroutine。
协程使用生成器定义:定义体中含有yield关键字
>>> from inspect import getgeneratorstate # ①
>>> def coroutine():
... print("step one")
... x = yield
... print("step two x value :", x)
...
>>> cor = coroutine() # ②
>>> getgeneratorstate(cor)
'GEN_CREATED'
>>> cor.send(None) # next(cor)效果一样 # ③
step one
>>> getgeneratorstate(cor)
'GEN_SUSPENDED'
>>> cor.send(123) # ④
step two x value : 123
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> getgeneratorstate(cor)
'GEN_CLOSED'
①协程有四种状态,可以使用inspect.getgenerator获得协程当前的状态。
定义协程函数coroutine。
②创建协程实例,获得当前状态'GEN_CREATED'。
③使用.send(None)激活协程,暂停的yield处,此时协程状态'GEN_SUSPENDED'。
④使用.send(123)传递x值,继续执行后面的语句,此时协程状态'GEN_CLOSED'。
执行的协程定义体的末尾,导致生成器向往常一样,抛出StopIteration异常。
- 协程有4中状态,上述事例显示了3中,还有一种:
'GEN_RUNNING' ,解释器正在执行(只有在多线程应用中才能看到这个状态。此外,生成器对象在自己身上调用 getgeneratorstate 函数也行,不过这样做没什么用) - 协程只有处于'GEN_SUSPENDED'状态时才能使用.send(val)
- 协程处于'GEN_CREATED'状态时,必须使用next(cor)或者cor.send(None)激活协程。