协程:协作式------非抢占式的程序
A------>B------>A------C
yield(协程)
用户态的切换
key:什么时候切换
协程主要解决的也是操作IO操作
协程本质上就是一个县城
协程的优势:
1 没有切换的消耗
2 没有锁的概念
有一个问题:能用多核吗?可以采用多进程程+协程一个很好的解决并发的方案
生成器
def f():
print('ok')
s = yield 6
print(s) # 5
print('ok2')
yield
gen = f()
Ret = gen.__next__() # ok
print(Ret) # 6
gen.send(5)
# gen.__next__() # ok2
协程
协程,又称微线程,纤程。英文名Coroutine。
优点1:协程级高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程化,线程数量越多,协程的性能优势就越明显。
有点2:不需要多线程的锁机制,因为只有一把锁,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
import time
def consumer(name):
print('%s等着吃包子' % name)
while True:
baozi = yield
print('%s吃了第%s个包子' % (name, baozi))
def producer():
next(con1)
next(con2)
n = 0
while True:
time.sleep(1)
print('------包子------%s and %s' % (n, n + 1))
con1.send(n)
con2.send(n + 1)
n = n + 2
if __name__ == '__main__':
con1 = consumer('c1')
con2 = consumer('c2')
producer()
Greenlet
greenlet是一个用C实现的协程模块,相比与python自带的yeild,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator