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

  • 一个似乎有点问题的例子
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. 转:TSDF in Kinect fusion

    KinectFusion中用到的TSDF Fusion 原po:https://blog.csdn.net/qq_31785865/article/details/78524429 最近在看关于稠密三 ...

  2. EF-初识

    什么是ORM 起源随着编程的发展,程序里都是面向对象啥的,但是数据库发展呢  网状数据库 ->层次数据库 ->关系数据库(当然还有nosql数据库  我们只是做热数据缓存  后面将会讲到) ...

  3. NationalInstruments project

    //using NationalInstruments.NI4882; //请将项目文件中的"AutoGenerateBindingRedirects"属性设置为true //ht ...

  4. java中整数的默认为int类型的一些问题

    thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...

  5. 通过vs2015给QT添加模块

    Qt VS Tools->Qt Project Settings->Qt Modules

  6. c语言 运算器

    #include<stdio.h> #include<stdbool.h> void menu(){ printf("************************ ...

  7. DMA存储器到存储器传输代码讲解

    M to M:Flash to Sram,把内部flash的数据传输到内部SRAM(DRAM主要存放的是变量, flash 主要存放代码) M to P: SRAM to 串口,同时LED闪烁,演示D ...

  8. VMware Workstation虚拟机安装

    VMware Workstation虚拟机安装 我们缺乏资金, 所以吃土.我们想搭 hadoop 集群, redis 集群, k8s 集群, 怎么办? 用虚拟机!! 一. 安装普通版本(Worksta ...

  9. (十) 使用Hibernate 注解

    Hibernate里有两种注解 : Hibernate 注解 JPA注解 主键生成机制 : http://www.cnblogs.com/ph123/p/5692194.html 案例一:   用注解 ...

  10. Rider开发开发.NET Framework 4.5项目遇到的一些问题

    使用rdier自带resharper功能,蛮爽的但是编译旧的项目时一直报错:Invalid option 'portable' for /debug; must be full or pdbonly' ...