欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python连载40-协程定义及状态、send语句、yield用法

程序员文章站 2023-11-18 19:54:52
一、协程 1.历史进程: (1)3.4引入协程,用yield来实现 (2)3.5引入协程语法 (3)实现协程比较好的包有asyncio,tornado,gevent 2.定义:协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序 3.从技术角度讲,协程就是 ......

一、协程

1.历史进程:

(1)3.4引入协程,用yield来实现

(2)3.5引入协程语法

(3)实现协程比较好的包有asyncio,tornado,gevent

2.定义:协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序

3.从技术角度讲,协程就是一个可以暂停执行的函数,或者干脆把协程理解为一个生成器

4.协程对资源的消耗很小,要比多进程消耗的资源小多了,因此多并发下,协程更节省资源。

5.协程的实现

(1)yield返回;(2)send调用

(3)协程的三个状态:

 

inspect.geigeneratorstate(...)函数确定,该函数会返回下面的字符串中的一个:

gen_created:等待开始执行

gen_running:解释器正在执行

gen_suspened:在yield表达式处暂停

gen_closed:执行结束

next预激(prime)

 

 

6.举例子(注意里面的注释)

 

def simple_coroutine():

    print("->start")

    x = yield#这个函数执行到这里停止了,等待着给它赋值,也就是后面的send语句

    print("->recived",x)

#主线程

sc = simple_coroutine()

print(1111)

#可以使用sc.send(none),效果一样

next(sc)#预激

print(2222)

sc.send("zhexiao")

 

执行顺序过程如下:

Python连载40-协程定义及状态、send语句、yield用法

执行结果:

Python连载40-协程定义及状态、send语句、yield用法

7,既返回值又用send语句的代码

注意:

可以看出这个yield相当于return 语句通过后面的send,之后等价于input语句

 

def simple_coroutine2(a):

    print("->start")

    b = yield a#可以看出这个yield相当于return 语句通过后面的send,之后等价于input语句

    print("->recived",a,b)

    c = yield a+b

    print("->recived",a,b,c)

​

sc2 = simple_coroutine2(5)

aa = next(sc2)

print(aa)

bb = sc2.send(6) #5,6

print(bb)

cc = sc2.send(7) #5,6,7

print(cc)

 

Python连载40-协程定义及状态、send语句、yield用法

8.协程异常

协程中未处理的异常会向上冒泡,传给next函数或者send方法的调用方(即触发协程的对象)

停止协程的一种方法:发送某个哨符值,让协程退出,内置的none和ellipsis等常量经常用作哨符值

二、源码

d27_3_usage_of_coroutine.py

https://github.com/ruigege66/python_learning/blob/master/d27_3_usage_of_coroutine.py​

2.csdn:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

 Python连载40-协程定义及状态、send语句、yield用法