""" ----协程---- 可以这么理解是协助线程更高效的工作 本质就是单线程实现并发 也称之为微线程(它比线程更轻量级 单线程下任务的切换 比操作系统切换线程要简单的多) 为什么有 是因为 在CPython中 无法并行执行任务导致效率低 所以我们就需要一种方案 能够将单线程的效率最大化 就是协程 Python中 使用Gevent模块来 实现协程 其能在多个任务间进行切换 而且能够自己检测IO """
from gevent import monkey# 必须打补丁才能检测IO是否堵塞monkey.patch_all()import gevent,timedef task1(): print("task1 run") time.sleep(3) print("task1 over")def task2(): print("task2 run") print("task2 over")# 先提交线程g1 = gevent.spawn(task1)g2 = gevent.spawn(task2)# 将任务全部执行gevent.joinall([g1, g2]
""" ----单线程并发---- 通过生成器就能完成并发执行 生成器的特点 只要函数中出现了yield该函数就变成了生成器 在执行时与普通函数有什么区别?? 单线程并发 是为了提高效率 对于计算密集型任务 单线程并发 反而降低效率 对于IO密集型 如果可以在执行IO操作的时候 切换到其他计算任务 就能提高CPU占用率 从而提高效率 """
# 实现单线程并发的原理import timedef task1(): a = 1 while True: print("task1 run") a += 1 print(a) yielddef task2(): g = task1() while True: print("task2 run") time.sleep(2) next(g)task2()
""" ----单线程并发greenlet模块---- greenlet 主要封装了生成器 是的我们在使用生成器实现并发时 简化了代码 """
import greenletimport timedef task1(): print("task1 run") time.sleep(2) g2.switch() print("task1 run")def task2(): print("task2 run") g1.switch()g1 = greenlet.greenlet(task1)g2 = greenlet.greenlet(task2)g1.switch()