协程

什么是协程?

  进程 :资源单位

  线程 :执行单位 

  协程 :单线程下实现并发

  复习 什么是并发 

    多道技术(时间上的复用) 切换 + 保存状态

    看起来像同时执行 就可以称之为并发

  协程: 完全是程序员自己意淫出来的名词  单线程下实现并发

  程序员自己通过代码自己检测程序中的IO
    一旦遇到IO自己通过代码切换
  给操作系统的感觉是你这个线程没有任何的IO
  ps:欺骗操作系统 让它误认为你这个程序一直没有IO
    从而保证程序在运行态和就绪态来回切换
      提升代码的运行效率

切换+保存状态就一定能够提升效率吗???
当你的任务是iO密集型的情况下 提升效率
如果你的任务是计算密集型的 降低效率
#基于yield并发执行  1.3952205181121826
import time
def func1():
    while True:
        10000000+1
        yield

def func2():
    g=func1()
    for i in range(10000000):
        time.sleep(100)  # 模拟IO,yield并不会捕捉到并自动切换
        i+1
        next(g)

start=time.time()
func2()
stop=time.time()
print(stop-start)
需要找到一个能够识别IO的一个工具  gevent 模块
from gevent import monkey;monkey.patch_all()  # 由于该模块经常被使用 所以建议写成一行
from gevent import spawn
import time
"""
注意gevent模块没办法自动识别time.sleep等io情况
需要你手动再配置一个参数  他就是我们的小猴老师 monkey
"""

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) 他会有一个返回值 可是使用join方法 不然 spawn()里的函数就直接执行 但是spawn也不等他执行完就 结束了
g2 = spawn(ha)  # spawn会检测所有的任务
g3 = spawn(heiheihei)
g1.join()
g2.join()
g3.join()

print(time.time() - start)

 

posted @ 2019-08-15 17:12  LD_Dragon  阅读(174)  评论(0编辑  收藏  举报