协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中自己规定代码块的执行顺序,和多线程相比,线程数量越多则协程的优势越明显;另外它不存在多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协成中控制共享资源不加锁,只需要判断状态。
Python对协程的支持是通过generator实现的。
def Cola():
r=''
while True:
i=yield r
if not i:
break
print 'i finish my cola %s'% n
r='thank you'
def Bread(c):
c.send(None)
i=0
while i<5:
i=i+1
print 'i finsh my bread %s'% n
r=c.send(i)
print 'i finish my dinner %s'%r
c.close()
c=Cola()
Bread(c)
Python通过yield提供了对协程的基本支持,但是不完全。
协程有两个模块分别为greenlet和gevent 其中greenlet为原始的模块而gevent为高级的,在greenlet的基础上进行了封装使用更为方便,可以通过pip3安装gevent也可以源码安装,需要注意安装gevent 的时候需要先安装greenlet。
1.使用greenlet实例:
from greenlet import greenlet
def test1():
print(12)
gr2.switch()
print (34)
gr2.switch()
def test2():
print (56)
gr1.switch()
print (78)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
#######output#######
12
56
34
78
2.gevent实例
import gevent
def foo():
print('12')
gevent.sleep(0)
print('34')
def bar():
print('56')
gevent.sleep(0)
print('78')
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行。