协程简介
进程是资源单位,线程是执行单位,这两者是实际存在的。对于协程,程序员为了解决单线程下IO阻塞的问题,自己定义的。在单线程下,协程通过切换程序以及保存状态的操作,让多个程序看起来是同时执行的,表现出没有IO阻塞的状态。
程序员自己通过代码检测自己写的程序中的IO,一旦遇到IO程序通过代码自己切换,欺骗了操作系统,让操作系统认为这个线程没有IO,保证程序在运行态和就绪态之间来回切换,提升了代码的运行效率。
上述过程的实现是通过切换加保存运行状态的操作实现,但是在该操作下代码的运行效率不一定提升。在密集IO操作下该方法可以提高程序运行效率,但是在计算密集型下代码效率会大大降低。
在python中,yield可以保存上一次的运行状态。上述方法就是基于yield实现的。
为了方便使用,程序员将该方法封装成gevent包,并将该方法命名为协程。
from gevent import monkey;monkey.patch_all() # 由于该模块经常被使用 所以建议写成一行
from gevent import spawn
import time
"""
注意gevent模块没办法自动识别time.sleep等io情况
需要你手动再配置一个参数
"""
def heng():
print("哼")
time.sleep(2)
print('哼')
def ha():
print('哈')
time.sleep(3)
print('哈')
def heiheihei():
print('嘿嘿嘿')
time.sleep(5)
print('嘿嘿嘿')
start = time.time()
g1 = spawn(heng)
g2 = spawn(ha) # spawn会检测所有的任务,当遇到IO时,spawn会及时切换程序
g3 = spawn(heiheihei)
g1.join()
g2.join()
g3.join()
print(time.time() - start) # 5.0002686977386475