协程,又称微线程。英文名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----协程相关推荐

  1. python自学用什么书好-适合python基础学习的好书籍

    分享几本python基础学习的书籍给大家 <Python编程:从入门到实践> 内容简介:本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用P ...

  2. python基础学习的书籍

    分享几本python基础学习的书籍给大家 <Python编程:从入门到实践> <Python编程:从入门到实践> 书籍详情链接 内容简介:本书是一本针对所有层次的Python ...

  3. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  4. Python 基础学习笔记 03

    Python基础系列 Python 基础学习笔记 01 Python 基础学习笔记 02 Python 基础学习笔记 03 Python 基础学习笔记 04 Python 基础学习笔记 05 文章目录 ...

  5. python心得体会-终于懂得python基础学习心得

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  6. python开发需要掌握哪些知识-Python基础学习需要掌握哪些知识

    1.1Python的对象 python的内置对象类型有很多,包括数字,字符串,列表,集合,元组,字典等等,在Python中,一切皆对象 pickle腌制--在Python中,如果有一些对象需要持久性存 ...

  7. Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho

    Python基础学习-Python中最常见括号().[].{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho ...

  8. python并发编程之协程

    python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...

  9. python基础学习_转行零基础该如何学习python?很庆幸,三年前的我选对了

    这似乎是一个如荼如火的行业,对于一直在思考着转行的我,提供了一个不错的方向. 这个行业当然就是python程序员,真正开始决定转行是在24岁的时候,到现在已经有三年多了,我从零开始,每天用业余两个小时 ...

  10. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

最新文章

  1. 在小程序开发路上踩过的小坑
  2. 有意思的前端函数面试题
  3. 04_关于元数据,ResultSetMetaData对象以及API方法介绍
  4. 适合oracle运行的软件环境,创建最适合的Oracle运行环境
  5. JZ55 二叉树深度
  6. Linux安装Python3详解
  7. php pdf转为jpg 插件,php使用Image Magick将PDF文件转换为JPG文件的方法
  8. 拓端tecdat|matlab预测ARMA-GARCH 条件均值和方差模型
  9. 华硕电脑桌面没有计算机图标 怎么弄出来,笔记本电脑开机蓝屏没桌面图标的方法...
  10. MogileFS原理
  11. 教孩子学编程 python 下载_教孩子学编程 python语言版
  12. loki日志收集系统部署
  13. 小米10手机电路图 主板元件位号图
  14. matlab plotyy 横坐标,[转载]关于plotyy的坐标轴 设置
  15. 为Ribbon Client自定义配置
  16. 比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
  17. 文本文件编码 email编码
  18. 实验二 matlab矩阵分析与处理
  19. Python个人博客项目-5.统计数据应用开发
  20. 格式过两遍的硬盘还能恢复数据吗

热门文章

  1. php 自定义超全局,一个超级简单的 PHP 超全局变量管理扩展
  2. tensorflow gan 网络 示例
  3. three.js 加载显示文字
  4. 2.Java中String,StringBuilder以及StringBuffer的关系与区别
  5. 五子棋html游戏代码与算法介绍
  6. CNN模型 INT8 量化实现方式(一)
  7. Spring boot 文件上传大小限制
  8. spring boot 搭建 和 全局异常处理
  9. 2020-12-28-bitset函数
  10. QPS和并发数,这次给你说清楚