协程 - 单线程并发--day36
"""
----协程----
可以这么理解是协助线程更高效的工作
本质就是单线程实现并发
也称之为微线程(它比线程更轻量级 单线程下任务的切换 比操作系统切换线程要简单的多)
为什么有 是因为 在CPython中 无法并行执行任务导致效率低 所以我们就需要一种方案 能够将单线程的效率最大化 就是协程
Python中 使用Gevent模块来 实现协程 其能在多个任务间进行切换 而且能够自己检测IO
"""
from gevent import monkey # 必须打补丁才能检测IO是否堵塞 monkey.patch_all() import gevent,time def 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 time def task1(): a = 1 while True: print("task1 run") a += 1 print(a) yield def task2(): g = task1() while True: print("task2 run") time.sleep(2) next(g) task2()
"""
----单线程并发greenlet模块----
greenlet 主要封装了生成器 是的我们在使用生成器实现并发时 简化了代码
"""
import greenlet import time def 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()