python基础学习22----协程
协程,又称微线程。英文名Coroutine。
协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
进程相关请看https://www.cnblogs.com/sfencs-hcy/p/9744946.html
线程相关请看https://www.cnblogs.com/sfencs-hcy/p/9721362.html
1.yield实现的协程
def consumer(name):while True:bone = yieldprint("[%s] 正在使用 %s" % (name, bone))def producer(obj1, obj2):obj1.send(None) obj2.send(None) n = 0while n < 5:n += 1print("[producer]正在生产 %s" % n)obj1.send(n)obj2.send(n)if __name__ == '__main__':con1 = consumer("consumerA")con2 = consumer("consumerB")producer(con1, con2)
2.greenlet实现协程
greenlet进行手动切换实现协程,切换的方式是switch
from greenlet import greenlet import timedef producer():while 1:print('生产一件商品')time.sleep(0.5)g2.switch()def consumer():while 1:print('使用一件商品')time.sleep(0.5)g1.switch()g1 = greenlet(producer) #创建协程g1 g2 = greenlet(consumer)g1.switch()
3.Gevent实现协程
Gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。它让开发者在不改变编程习惯的同时,用同步的方式写异步I/O的代码
import geventdef competitor1():print("competitor1:我开始吃了")gevent.sleep(1)print("competitor1:我吃完了")def competitor2():print("competitor2:我开始吃了")gevent.sleep(2)print("competitor2:我吃完了")gr1=gevent.spawn(competitor1) gr2=gevent.spawn(competitor2)gevent.joinall([gr1,gr2])
gevent.sleep()是模拟IO阻塞,如果所有子程序都进入IO阻塞则等待最先完成阻塞的子程序,之后进入该子程序执行。
转载于:https://www.cnblogs.com/sfencs-hcy/p/9750512.html
python基础学习22----协程相关推荐
- python自学用什么书好-适合python基础学习的好书籍
分享几本python基础学习的书籍给大家 <Python编程:从入门到实践> 内容简介:本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用P ...
- python基础学习的书籍
分享几本python基础学习的书籍给大家 <Python编程:从入门到实践> <Python编程:从入门到实践> 书籍详情链接 内容简介:本书是一本针对所有层次的Python ...
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- Python 基础学习笔记 03
Python基础系列 Python 基础学习笔记 01 Python 基础学习笔记 02 Python 基础学习笔记 03 Python 基础学习笔记 04 Python 基础学习笔记 05 文章目录 ...
- python心得体会-终于懂得python基础学习心得
为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...
- python开发需要掌握哪些知识-Python基础学习需要掌握哪些知识
1.1Python的对象 python的内置对象类型有很多,包括数字,字符串,列表,集合,元组,字典等等,在Python中,一切皆对象 pickle腌制--在Python中,如果有一些对象需要持久性存 ...
- Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho
Python基础学习-Python中最常见括号().[].{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho ...
- python并发编程之协程
python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...
- python基础学习_转行零基础该如何学习python?很庆幸,三年前的我选对了
这似乎是一个如荼如火的行业,对于一直在思考着转行的我,提供了一个不错的方向. 这个行业当然就是python程序员,真正开始决定转行是在24岁的时候,到现在已经有三年多了,我从零开始,每天用业余两个小时 ...
- Python基础学习笔记三
Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...
最新文章
- 在小程序开发路上踩过的小坑
- 有意思的前端函数面试题
- 04_关于元数据,ResultSetMetaData对象以及API方法介绍
- 适合oracle运行的软件环境,创建最适合的Oracle运行环境
- JZ55 二叉树深度
- Linux安装Python3详解
- php pdf转为jpg 插件,php使用Image Magick将PDF文件转换为JPG文件的方法
- 拓端tecdat|matlab预测ARMA-GARCH 条件均值和方差模型
- 华硕电脑桌面没有计算机图标 怎么弄出来,笔记本电脑开机蓝屏没桌面图标的方法...
- MogileFS原理
- 教孩子学编程 python 下载_教孩子学编程 python语言版
- loki日志收集系统部署
- 小米10手机电路图 主板元件位号图
- matlab plotyy 横坐标,[转载]关于plotyy的坐标轴 设置
- 为Ribbon Client自定义配置
- 比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
- 文本文件编码 email编码
- 实验二 matlab矩阵分析与处理
- Python个人博客项目-5.统计数据应用开发
- 格式过两遍的硬盘还能恢复数据吗