定义

在2018年看Flutent python时了解到猴子补丁,知道咋回事,但是现在通过代码更深刻认识猴子补丁。

猴子补丁:在运行时修改类或模块,而不改动源码。

例子1 没有用猴子补丁

import gevent
from gevent import socket
# from gevent import monkey; monkey.patch_socket() urls = ['www.google.com', 'www.163.com', 'www.baidu.com'] def func(url):
import requests
result = requests.get('http://' + url)
return result jobs = [gevent.spawn(func, url) for url in urls]
gevent.joinall(jobs, timeout=2) print([job.value for job in jobs])

结果:

线程一直阻塞,没有输出结果到终端。

例子2 用了猴子补丁

import gevent
from gevent import socket
from gevent import monkey; monkey.patch_socket() urls = ['www.google.com', 'www.163.com', 'www.baidu.com'] def func(url):
import requests
result = requests.get('http://' + url)
return result jobs = [gevent.spawn(func, url) for url in urls]
gevent.joinall(jobs, timeout=2) print([job.value for job in jobs])

结果显示并没有阻塞:

本质

  1. requests是个同步库,所以会发生阻塞。
  2. requests基于urllib3, urllib3基于socket,例子2用gevent的非阻塞socket(由greenlet运行的socket)代替urllib3的socket,所以不阻塞了。
  3. The primary pattern used in gevent is the Greenlet, a lightweight coroutine provided to Python as a C extension module

牛逼的地方?

当一个库的代码是纯 Python 的时候,加上 monkey patch 技法,那么这个库使用的就是 gevent.socket 了,从而不需要任何更改就能够获得 gevent 的同步代码异步执行的“超级牛力”

参考

  1. https://en.wikipedia.org/wiki/Monkey_patch
  2. http://www.gevent.org/intro.html#monkey-patching
  3. https://www.zhihu.com/question/29746887/answer/45469424

Gevent和猴子补丁的更多相关文章

  1. python协程初步--gevent库使用以及解释什么是猴子补丁monkey_patch

    协程工作的特点是遇到阻塞或耗时的任务时就切换,协程的生存依赖于线程,线程依赖于进程 一个似乎有点问题的例子 import gevent,time def kisscpc(num): for i in ...

  2. 协程gevent模块和猴子补丁

    # pip 装模块 greenlet和gevent # 协程 # 与进程.线程一样也是实现并发的手段 # 创建一个线程.关闭一个线程都需要创建寄存器.栈等.需要消耗时间 # 协程本质上是一个线程 # ...

  3. python中的猴子补丁Monkey Patch

    python中的猴子补丁Monkey Patch 什么是猴子补丁 the term monkey patch only refers to dynamic modifications of a cla ...

  4. day38 各种队列、Event事件、协程、猴子补丁

    1.各种队列 我们已经学习了队列这种存取值的方法,我们以前使用的队列是可以进行进程间通信的(IPC),但是今天学习的这两种队列是不能进行进程间通信的,只能进行线程间的通信 这两种队列分别是先进后出式队 ...

  5. [Effective JavaScript 笔记]第42条:避免使用轻率的猴子补丁

    41条对违反抽象原则行为的讨论之后,下面聊一聊终极违例.由于对象共享原型,因此每一个对象都可以增加.删除或修改原型的属性.这个有争议的实践通常称为猴子补丁. 猴子补丁示例 猴子补丁的吸引力在于其强大. ...

  6. Python Monkey patch猴子补丁

    monkey patch (猴子补丁)   用来在运行时动态修改已有的代码,而不需要修改原始代码. 简单的monkey patch 实现:[python] #coding=utf-8 def orig ...

  7. python设计模式之猴子补丁模式

    1.所有书中都没有把猴子补丁作为一种设计模式来看待.因为设计模式的模式的命名是根据java中提炼出来的,语言方式决定了java绝对不会有也不需要有这种操作,不存在的.那自然设计模式不会包括猴子补丁模式 ...

  8. Python之猴子补丁

    1.在运行时,对属性,方法,函数等进行动态替换 2.其目的往往是为了通过替换,修改来增强,扩展原有代码的能力 #test2.py class Person: def get_score(self): ...

  9. python 模块会导入几次?猴子补丁为什么可以实现?

    一共三个文件 a.py内容是 print('被导入') x = 1 b.py内容是 import a a.x = 2 c.py内容是 import a import b print(a.x) 现在运行 ...

随机推荐

  1. 关闭Apache的目录浏览功能

    一.默认情况 默认情况下,Apache的配置文件C:\web\apache2.4\conf/httpd.conf中有如下参数: 引用 <Directory "/var/www/html ...

  2. Tickets HDU - 1260 简单dp

    #include<iostream> using namespace std; const int N=1e5; int T,n; int a[N],b[N]; int dp[N]; in ...

  3. H3C IP路由基础

    一.路由简介 在网络中路由器根据所收到的报文的目的地址选择一条合适的路径,并将报文转发到下一个路由器.路径中最后一个路由器负责将报文转发给目的主机. 路由就是报文在转发过程中的路径信息,用来指导报文转 ...

  4. phpstorm实现分屏展示代码

    第一种 选择你要分屏的页面 [Window]—>[Editor Tabs]—>[Split Vertically]or[Split Horizontally]  第二种 把鼠标箭头放到你想 ...

  5. 解决Maven依赖报红的批处理文件

    maven经常因为网络或者其他原因导致仓库jar包下载不完整,导致jar包依赖报红,此小工具可以一键删除未下载完成文件 set REPOSITORY_PATH=E:\deplor\apache-mav ...

  6. python 音频可视化

    代码整理好放在 github 上了: https://github.com/darkchii/visualize bilibili 演示视频:https://www.bilibili.com/vide ...

  7. 2个月,我从编程小白成为了Python研发工程师

    从编程小白,到Python研发工程师,需要多久呢? 答案就是:91门课,450个小时. 听起来似乎难以实现,但其实如果每天抽出八小时学习,两个月的时间,就能由编程小白转变成为Python工程师,听起来 ...

  8. C# asp.net 配置文件连接sql 数据库

    先引用 using System.Configuration;//配置文件using System.Data.SqlClient; 我这里使用的是SqlServer 2008  sa 用户 密码也为s ...

  9. MySQL启动和停止

    MySQL视为大仓库,关闭的时候有权限有身份都无法进入使用的时候要保持启用状态 方式一: 计算机游击找到“管理”打开 左侧栏目中找到“服务和应用程序”打开 打开服务 找到MySQL...,右击.... ...

  10. git的安装方法

    下载:https://git-scm.com/downloads