协程

文章目录

  • 概念 :
  • 优点 :
  • 缺点 :
  • 特点 :
  • yield的实现
  • greenlet模块
  • gevent模块

概念 :

是单线程下的并发,又称微线程,纤程。英文名Coroutine。
简单的解释:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。

优点 :

  1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
  2. 单线程内就可以实现并发的效果,最大限度地利用CPU、

缺点 :

  1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
  2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程

特点 :

必须在只有一个单线程里实现并发修改共享数据不需加锁用户程序里自己保存多个控制流的上下文栈。

yield的实现

代码演示:

import timedef consumer(name):"""这是一个生成器,调用的时候才执行:param name: 消费者的名字:return: 包子"""print("消费者准备吃包子。。。。。")while True:new_baozi = yield   #接受调用生成器的值print("%s吃第%d个包子"%(name,new_baozi))time.sleep(1)def producer(name):r = con1.__next__()r = con2.__next__()count = 1while True:print("%s正在生产第%d个包子和第%d个包子"%(name,count,count+1))#调用生成器并发送数据con1.send(count)con2.send(count+1)count += 2if __name__ == '__main__':con1 = consumer("铛铛")con2 = consumer("煤球")p = producer("孙大厨")

运行结果:

greenlet模块

greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之 间随意切换,而不需要把这个函数先声明为generator

安装 :pip3 install greenlet。如果引入的时候还是报错,使用pycharm进行下载安装, 选择 file --> settings --> Project:项目名称 --> Project Interpreter–>…

代码演示:

from greenlet import greenletdef work1():print(12)# 3.切换到test2()函数中gr2.switch()def work2():print(20)gr1.switch()print(43)#1. 将要执行的函数封装到 greenlet 对象中
gr1 = greenlet(work1)
gr2 = greenlet(work2)#2.想先执行哪个函数就可以使用  对象。swith()方法进行执行
gr1.switch()

运行结果:

gevent模块

Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet。

代码演示:

import requests
import gevent
import timedef f(url):print("get",url)resp = requests.get(url)data = resp.textprint("%d byte received from %s"%(len(data),url))#1.普通模式
s = time.time()
f("http://www.langlang2017.com/img/banner1.png")
f("http://www.langlang2017.com/img/banner2.png")
f("http://www.langlang2017.com/img/banner3.png")
f("http://www.langlang2017.com/img/banner4.png")e=time.time()
print("普通模式时间",e-s)#2.使用gevent模块
start = time.time()
gevent.joinall([gevent.span("http://www.langlang2017.com/img/banner1.png") ,#创建一个普通的greenlet对象并切换gevent.span("http://www.langlang2017.com/img/banner2.png") ,gevent.span("http://www.langlang2017.com/img/banner3.png") ]
)print("gevent时间",time.time()-start)

运行结果:

今天先将这里丫

python 之 ------- 协程(微线程)相关推荐

  1. python协程和线程区别_python 协程 及其与python多线程的区别和联系

    协程(coroutine)又称微线程,纤程,是种用户级别的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时候,将寄存器上下文和栈保存到其他地方,等待切换回来的时候恢复,并从之前保存的寄存器 ...

  2. Python基础入门教程:使用 Python 3 协程快速获得一个代理池

    Python基础入门教程:使用 Python 3 协程快速获得一个代理池 前言 在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞.比如我们使用 requests 库来进行网络爬虫请求的话, ...

  3. python中协程实现的本质以及两个封装协程模块greenle、gevent

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为 ...

  4. Python 的协程库 greenlet 和 gevent

    greenlet 官方文档:https://greenlet.readthedocs.io/en/latest/ From:https://www.jianshu.com/u/3ab212f28d91 ...

  5. Python高级——协程

    协程 协程与线程差异 在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单. 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复 ...

  6. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  7. python gevent async_详解python之协程gevent模块

    进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程. 在linux系统中,线程就是轻量级的进程,而我们 ...

  8. 【Python】【入门篇】十二、Python中协程

    目录 十二.Python中协程 12.1 协程的定义 12.2 协程 12.3 协程池 12.4 总结 十二.Python中协程 12.1 协程的定义 协程(Coroutine):是一种比线程更加轻量 ...

  9. python之协程与IO操作

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

  10. python多任务—协程(一)

    写在前面: 花了一周的时间,对协程做了一个简单的梳理,特别是异步编程asyncio库的使用,做了详细的说明.本文主要包括的知识点有:yield生成器的复习并实现协程的功能.greenlet库实现协程. ...

最新文章

  1. 阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能
  2. C++ STL算法之accumulate函数
  3. QT 5 安装 vs2017 后,出现找不到 rc.exe 问题
  4. sed是linux命令吗,Linux命令 sed
  5. centos7 zookeeper3.5.6单机伪集群部署
  6. excel查重_发票查重工具,不止查重这么简单,你还可以体验这些新玩法
  7. dmesg时间转换工具
  8. CAN笔记(5) 协议标准规格
  9. php ci controller,Codeigniter – CI_Controller与控制器
  10. python3 读写json文件,python3没有读取JSON文件righ
  11. 关注电子商务网站开发-《网站中常用的Jquery插件》
  12. python日历打印算法
  13. URL调用高德地图导航
  14. 最全面的应届毕业生落户上海指南(2021)
  15. 哈夫曼码的编译码系统
  16. 加拿大办理电动自行车申请GCC认证
  17. 【探花交友】保存用户信息、上传用户头像、用户信息管理
  18. 跨境电商|为什么客户服务中沟通很重要?
  19. 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?
  20. springMVC学习笔记二

热门文章

  1. Django 入门篇一
  2. Python入门7_抽象进阶
  3. 关于数据权限的几个问题
  4. ElasticSearch经典面试题
  5. springboot项目发布JAR包
  6. C++中string的用法
  7. HTTP权威指南记录 ---- HTTP报文
  8. 一、crontab 定时任务
  9. html5 Canvas 标签介绍
  10. AfterLogic WebMail