1.概念
协程又称纤程,轻型线程,指同一线程中能够互相切换的多个任务.
协程是代码级别的,对于操作系统来说并不可见.
由于协程之间的切换是代码级别的,不涉及到操作系统,不需要操作系统去进行切换,所有协程更加高效.
协程能够提高线程对CPU的利用率.
协程的特点:
- 与进程,线程比起来,协程不存在数据不安全的问题.
- 协程不能利用多核的性能.
协程是python中比较好的工具.
2.基本模型
#生产者消费者模型
def consumer(): #消费者
while True:
i = yield
def producer(): #生产者
c = consumer()
next(c)
for i in range(10000):
c.send(i)
producer()
3.gevent
gevent是一个第三方,能够实现协程的功能.
他的作用在于一旦程序进入阻塞状态就启动协程.
gevent的实现依赖于greenlet模块(同为第三方模块,但是只能实现进程间的切换,并不能遇到阻塞就切换)
gevent模块下的monkey.patch_all()能够使gevent识别所有的阻塞而不仅仅是gevent下的阻塞.
例:
from gevent import monkey;monkey.patch_all()
import gevent
def func(i):
print(i ** 2)
gevent.sleep(0.1)
for i in range(100):
print(i)
g = gevent.spawn(func,i)
gevent.sleep(0.1)
其他方法:
gevent_obj.join() 阻塞,直到协程对象完成
gevent.joinall(list)阻塞,直到列表中所有的携程对象完成