进程线程协程(协程篇)
Posted zpstu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程线程协程(协程篇)相关的知识,希望对你有一定的参考价值。
什么是协程?
首先,先说一个前提:子程序/函数:在所有语言中都是层级调用的,比如A调用B。在B执行过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后是A执行完毕返回。是通过栈实现的,一个线程就是执行一个子程序,子程序调用总是一个入口,一次返回,调用的顺序是明确的。
然后就是协程的概念:
看上去也是子程序,但执行过程中,在子程序的内部可终端,然后转而执行别的子程序,不是函数调用
# 协程
def C(): print(‘C--start‘) print(‘C--end‘) def B(): print(‘B--start‘) C() print(‘B--end‘) def A(): print(‘A--start‘) B() print(‘A--end‘) A() # 协程的特点就是一个只有一个线程在执行,协程的执行效率极高 # 因为只有一个线程,也不存在同时写变量的冲突,在协程中共享资源不加锁,只需要判断状态
# 协程原理 # python 对协程的支持是通过generator实现的 def run(): print(1) yield 10 print(2) yield 20 print(3) yield 30 # 协程的最简单风格,控制函数的阶段执行,节约协程或者进程的切换 # 返回只是一个生成器 m = run() print(next(m)) print(next(m)) print(next(m))
# 数据传输 def run(): # 空变量,储存的作用data始终为空 data = ‘‘ # 第一次执行的 r = yield data # 出去r=,后面也是第一次执行的;第一次执行,传递进来个空值,返回为空 # r = a print(1, r, data) # 第二次传递进来的a r = yield data # 第二次返回一个空 # r = b print(2, r, data) r = yield data # r = c print(3, r, data) r = yield data m = run() print(m.send(None)) print(m.send(‘a‘)) print(m.send(‘b‘)) print(m.send(‘c‘))
# 生产者与消费者 def product(a): a.send(None) for i in range(5): print(‘生产者与消费者‘) r = a.send(str(i)) print(‘消费者消费了数据{}‘.format(r)) a.close() def customer(): data = ‘‘ while True:: n = yield data if not n: return print(‘消费者消费了{}‘。format(n)) data = ‘200‘ c = customer() product(c)
以上是关于进程线程协程(协程篇)的主要内容,如果未能解决你的问题,请参考以下文章