协程 - 单线程并发--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()

 

posted @ 2019-01-04 17:33  WenChen-0o0  阅读(183)  评论(0编辑  收藏  举报