协程工作的特点是遇到阻塞或耗时的任务时就切换,协程的生存依赖于线程,线程依赖于进程

  • 一个似乎有点问题的例子
import gevent,time

def kisscpc(num):
for i in range(num):
print ("吻了第%s下陈培昌"%(i+),gevent.getcurrent())
time.sleep() def kisscj(num):
for i in range(num):
print ("吻了第%s下程劲"%(i+),gevent.getcurrent())
time.sleep() def kissxxd(num):
for i in range(num):
print ("吻了第%s下徐晓冬"%(i+),gevent.getcurrent())
time.sleep() g1 = gevent.spawn(kisscj,)
g2 = gevent.spawn(kisscpc,)
g3 = gevent.spawn(kissxxd,)
g1.join()
g2.join()
g3.join()

输出结果:

吻了第1下程劲 <Greenlet at 0x7fe77eed7648: kisscj()>
吻了第2下程劲 <Greenlet at 0x7fe77eed7648: kisscj()>
吻了第3下程劲 <Greenlet at 0x7fe77eed7648: kisscj()>
吻了第1下陈培昌 <Greenlet at 0x7fe77eed7a48: kisscpc()>
吻了第2下陈培昌 <Greenlet at 0x7fe77eed7a48: kisscpc()>
吻了第1下徐晓冬 <Greenlet at 0x7fe77eed7b48: kissxxd()>
吻了第2下徐晓冬 <Greenlet at 0x7fe77eed7b48: kissxxd()>
吻了第3下徐晓冬 <Greenlet at 0x7fe77eed7b48: kissxxd()>
吻了第4下徐晓冬 <Greenlet at 0x7fe77eed7b48: kissxxd()>
吻了第5下徐晓冬 <Greenlet at 0x7fe77eed7b48: kissxxd()>

貌似这样的结果并未能达到我们所期待的并发效果,任务仍旧是按部就班的执行。答案在于使用gevent时,相关的一切都要更换成gevent的

  • 耗时,阻塞部分换成gevent库的实现
import gevent,time

def kisscpc(num):
for i in range(num):
print ("吻了第%s下陈培昌"%(i+),gevent.getcurrent())
#time.sleep()
gevent.sleep()
def kisscj(num):
for i in range(num):
print ("吻了第%s下程劲"%(i+),gevent.getcurrent())
#time.sleep()
gevent.sleep()
def kissxxd(num):
for i in range(num):
print ("吻了第%s下徐晓冬"%(i+),gevent.getcurrent())
   #time.sleep()
gevent.sleep()
g1 = gevent.spawn(kisscj,)
g2 = gevent.spawn(kisscpc,)
g3 = gevent.spawn(kissxxd,)
g1.join()
g2.join()
g3.join()

输出结果:

吻了第1下程劲 <Greenlet at 0x7f2af804e648: kisscj()>
吻了第1下陈培昌 <Greenlet at 0x7f2af804ea48: kisscpc()>
吻了第1下徐晓冬 <Greenlet at 0x7f2af804eb48: kissxxd()>
吻了第2下程劲 <Greenlet at 0x7f2af804e648: kisscj()>
吻了第2下陈培昌 <Greenlet at 0x7f2af804ea48: kisscpc()>
吻了第2下徐晓冬 <Greenlet at 0x7f2af804eb48: kissxxd()>
吻了第3下程劲 <Greenlet at 0x7f2af804e648: kisscj()>
吻了第3下徐晓冬 <Greenlet at 0x7f2af804eb48: kissxxd()>
吻了第4下徐晓冬 <Greenlet at 0x7f2af804eb48: kissxxd()>
吻了第5下徐晓冬 <Greenlet at 0x7f2af804eb48: kissxxd()>

哟比~这才是我们期盼的!

但是,对于一些早期的代码,每个任务的耗时部分仍有可能采用了常规的代码写法(而不是gevent.方法名),这就意味着,我们需要改动代码的绝大多数部分

这时,猴子补丁就派上用场了

import gevent,time
from gevent import monkey
monkey.patch_all()
def kisscpc(num):
for i in range(num):
print ("吻了第%s下陈培昌"%(i+),gevent.getcurrent())
time.sleep()
#gevent.sleep()
def kisscj(num):
for i in range(num):
print ("吻了第%s下程劲"%(i+),gevent.getcurrent())
time.sleep()
#gevent.sleep()
def kissxxd(num):
for i in range(num):
print ("吻了第%s下徐晓冬"%(i+),gevent.getcurrent())
time.sleep()
#gevent.sleep()
g1 = gevent.spawn(kisscj,)
g2 = gevent.spawn(kisscpc,)
g3 = gevent.spawn(kissxxd,)
g1.join()
g2.join()
g3.join()

输出结果:

吻了第1下程劲 <Greenlet at 0x7f97e4981948: kisscj()>
吻了第1下陈培昌 <Greenlet at 0x7f97e4981a48: kisscpc()>
吻了第1下徐晓冬 <Greenlet at 0x7f97e4981b48: kissxxd()>
吻了第2下程劲 <Greenlet at 0x7f97e4981948: kisscj()>
吻了第2下陈培昌 <Greenlet at 0x7f97e4981a48: kisscpc()>
吻了第2下徐晓冬 <Greenlet at 0x7f97e4981b48: kissxxd()>
吻了第3下程劲 <Greenlet at 0x7f97e4981948: kisscj()>
吻了第3下徐晓冬 <Greenlet at 0x7f97e4981b48: kissxxd()>
吻了第4下徐晓冬 <Greenlet at 0x7f97e4981b48: kissxxd()>
吻了第5下徐晓冬 <Greenlet at 0x7f97e4981b48: kissxxd()>

我们看到仅仅用了monkey.patch_all()就达到了期待的效果,而其他方面几乎没什么改变

python协程初步--gevent库使用以及解释什么是猴子补丁monkey_patch的更多相关文章

  1. Python 协程(gevent)

    协程,又叫微线程,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上 ...

  2. python 协程 greenlet gevent

    一.并发的本质 切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长时间片到了 二.协程 ...

  3. python协程初步---一个生成器的实现

    和列表那种一下占据长度为n的内存空间不同的是,生成器在调用的过程中逐步占据内存空间,因此有着很大的优势 一个斐波纳契数列的例子 def myfibbo(num): a,b=, count= while ...

  4. python协程初步---一个迭代器的实现

    一般认为迭代器就是实现了两个方法__iter__和__next__ 先创建这样一个类 from collections import Iterable from collections import ...

  5. 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页

    协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...

  6. 并发编程(六)——进程/线程池、协程、gevent第三方库

    进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...

  7. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  8. 5分钟完全掌握Python协程

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 1. 协程相关的概念 1.1 进程和线程 进程(Process)是应用程序启动的实例,拥有代码.数据 ...

  9. 初学Python——协程

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

随机推荐

  1. 岩哥带你飞——Spring 学习1&重要组件

    ------------------------------------------------------------------------------ 准备工作:1.创建一个web 项目 2.创 ...

  2. SQL SERVER 实现多行转多列

    有这样一个需求,一个表单主表,一个扩展列表,查询的时候要把扩展列表中的多行转成主表多列. 比如 dt_zhubiao [主表] id type title 1 1 表单1-1 2 1 表单1-2 3 ...

  3. if语句、while和for循环

    一.if语句 1.多路分支 if 条件1: 代码块1 elif 条件2: 代码块2 else: 代码块3 #python会执行第一次测试为真的语句,如果所有测试都为假,就执行else部分(本例) 2. ...

  4. 【规律】Farey Sums

    [参考博客]: https://blog.csdn.net/meopass/article/details/82952087 Farey Sums 题目描述 Given a positive inte ...

  5. electron客户端开发

    如何新建一个 Electron 项目? electron快速入门笔记: https://www.jianshu.com/p/f134878af30f 然后自己新建一个 Electron 项目,在项目中 ...

  6. css 清除浮动 & BFC

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 文档流的概念:html 中 block 块元素默认是单独占据一行的,从上到下排列,也就是我们说的文档流. ...

  7. 怎样使用wordpress模板建站

    这里仅整理一个思路, 日后会详细补充. 1. 首先得下载 wordpress安装包, 上传到服务器上的 /var/www/html, 然后解压. 2. 然后安装apache 并启动, 启动一般是使用: ...

  8. 音视频入门-04-BMP图像四字节对齐的问题

    * 音视频入门文章目录 * BMP 图像四字节对齐 表示 BMP 位图中像素的位元是以行为单位对齐存储的,每一行的大小都向上取整为4字节(32 位 DWORD)的倍数.如果图像的高度大于 1,多个经过 ...

  9. 音视频入门-01-认识RGB

    * 音视频入门文章目录 * RGB 简介 RGB 色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红 ...

  10. 【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率

    原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...