python协程入门
在了解协程之前, 我们需要再次回想一下python中的多个函数执行的顺序是怎样的?
对于正常函数之间的调用:是通过 栈执行的一个子程序,子程序调用总是一个入口,返回之后再继续跳转到另一个函数内部。
不是转到别的函数
,它的执行过程像线程的切换,但是只会在一个线程中执行(中断,跳转执行)极高
,因为只有一个线程, 不存在同时写同一个变量的冲突,在协程中共享资源不用加锁(多线程在执行对同一个数据写操作时为了避免冲突必须加锁),只需要判断状态即可yield
实现,控制函数内部的阶段性执行,返回值的时一个生成器。yield
之后,会中断执行后面的代码StopIteration
具有生成器的所有的特性。
协程是单个函数(一个线程),可以随时中断执行,也就意味着,在中断过程中,可以做一些有意义的事情(它并不像普通函数间的调用,一个函数在执行后是没办法继续去操作该函数的,如传递新的数据,修改函数内部的变量等),比如可以在此时传递新的数据!
函数
及 生成器
的综合体,so,它拥有了两者的共同特性
send
方法m=run()
想象一下,如果run函数中yield
是关键字 return
, 那么此时函数返回的是一个变量,但是此时使用yield
,那么一切都变了, 它不再是一个函数,而是一个生成器。m.send(None)
来启动协程m.send("a")
, 此时将“a”的值传递进生成器内部,那么内部如何接受这个外来数据呢
?于是我们用r
变量来接收next()
方法直到遇到下一个yield暂停执行空字符串
,因为 r 其实与 data没有任何关系,在run函数未执行完毕之前,data的值没有发生任何改变生产者
随处可见,顾名思义可以创建某些产品的机构或个人
,消费者则是用来消化某些产品的用户或者机构
cpu
内部执行的一段代码,代码运行在计算机内部(内存中)都是读写操作,生产者消费者模型
中,生产者
用来产生程序内部需要的数据,消费者
则用来处理这些数据!yield
关键字生成器函数
g.send(None)
触发协程g.send("a")
像xie程内部发送数据g.close()
关闭协程