协程
# 串行执行时间 1.2812573909759521 # import time # # # def func1(): # for i in range(10000000): # i += 1 # # # def func2(): # for i in range(10000000): # i += 1 # # # start_time = time.time() # func1() # func2() # print(time.time() - start_time) ''' 协程是将单线程运行状态变成只有就绪态和运行态, 用代码取消IO阻塞,实行一种检测机制,比如监测两个函数,如果一个函数遇到IO阻塞时, 他会自动切到另一个函数,执行另一个函数的代码,另一个函数再遇到IO阻塞时, 会再切回原来的函数, 如果两个函数都遇到IO阻塞时,他会来回切换 最佳运行状态是 多进程加多线程加协程 ''' ''' 进程:资源单位 线程:执行单位 协程:单线程下实现并发 并发 切换+保存状态 ps:看起来像同时执行的 就可以称之为并发 协程:完全是程序员自己意淫出来的名词 单线程下实现并发 并发的条件? 多道技术 空间上的复用 时间上的复用 切换+保存状态 程序员自己通过代码自己检测程序中的IO 一旦遇到IO自己通过代码切换 给操作系统的感觉是你这个线程没有任何的IO ps:欺骗操作系统 让它误认为你这个程序一直没有IO 从而保证程序在运行态和就绪态来回切换 提升代码的运行效率 ''' import time from gevent import monkey;monkey.patch_all() # 由于该模块经常被使用 所以建议写成一行 from gevent import spawn ''' 注意gevent模块没办法自动识别time.sleep等IO 需要手动再配置一个参数,这个参数就是 from gevent import monkey;monkey.patch_all() ''' def heng(n): print('哼', n) time.sleep(2) print('哼哼', n + 1) def ha(): print('哈') time.sleep(3) print('哈哈') def hei(): print('嘿') time.sleep(5) print('嘿嘿') start = time.time() obj1 = spawn(heng, 1) # 他会自动执行函数,并监测IO 这里的传入参数的方式与进程池相近 obj2 = spawn(ha) # spawn会检测所有的任务 obj3 = spawn(hei) obj1.join() # 这里必须加join 不加join就会直接执行下面的代码 主进程不会等待这个进程 obj2.join() obj3.join() print('耗时%s' % (time.time() - start)) # 耗时5.004220008850098 # # 这样我们在单进程下实现了并发,这就是协程