"""
----协程----
可以这么理解是协助线程更高效的工作
本质就是单线程实现并发
也称之为微线程(它比线程更轻量级 单线程下任务的切换 比操作系统切换线程要简单的多)
为什么有 是因为 在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()