博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
协程 - 单线程并发--day36
阅读量:4931 次
发布时间:2019-06-11

本文共 1333 字,大约阅读时间需要 4 分钟。

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

 

转载于:https://www.cnblogs.com/wenchen/p/10221237.html

你可能感兴趣的文章
Struts 框架 之 文件上传下载案例
查看>>
【重走Android之路】【路线篇(二)】知识点归纳
查看>>
graphviz入门
查看>>
JAVA编码(37)—— Java字符串转换为MAP对象
查看>>
jquery.validate.js 一个jQuery验证格式控件
查看>>
有表格的九九乘法表
查看>>
WPF 4 DataGrid 控件(自定义样式篇)
查看>>
改善C#程序的建议1:非用ICloneable不可的理由
查看>>
PHP的错误机制总结
查看>>
window.location
查看>>
C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)
查看>>
使用Flex图表组件
查看>>
官网分析(英雄传奇)(如何设计网站前端)
查看>>
SSH Key的生成和使用(for git)
查看>>
html5--6-52 动画效果-过渡
查看>>
调查表与调查结果分析
查看>>
Windows系统下安装MySQL详细教程(命令安装法)
查看>>
PHP实用小程序(六)
查看>>
PDFsharp Samples
查看>>
django-cms 代码研究(八)app hooks
查看>>