返回顶部
首页 > 资讯 > 后端开发 > Python >python monkey_patch浅
  • 798
分享到

python monkey_patch浅

pythonmonkey_patch 2023-01-31 06:01:02 798人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

最近做了一个neutron集成vyatta的任务,顺便认真学习下neutron的代码,头几行就看到了monkey_patch。首先就从neutron-server的启动脚本开始:[root@controller-39 ~]# cat /us

最近做了一个neutron集成vyatta的任务,顺便认真学习下neutron的代码,头几行就看到了monkey_patch。


首先就从neutron-server的启动脚本开始:

[root@controller-39 ~]# cat /usr/bin/neutron-server
#!/usr/bin/python
# PBR Generated from u'console_scripts'
import sys
from neutron.server import main
if __name__ == "__main__":
    sys.exit(main())
[root@controller-39 ~]# cat /usr/lib/Python2.7/site-packages/neutron/server/__init__.py
import sys
import eventlet
eventlet.monkey_patch()        #  这里使用monkey_patch

from oslo.config import cfg

from neutron.common import config
from neutron import service

from neutron.openstack.common import gettextutils
from neutron.openstack.common import log as logging
gettextutils.install('neutron', lazy=True)

LOG = logging.getLogger(__name__)

def main():


什么是monkey_patch?

简单说就是程序在运行时动态对已有代码进行修改,而不需要修改原始代码。来看个例子:

[root@controller-39 tmp]# cat monkey_patch_test.py
class Monkey_patch(object):
    def patch(self):
        print "patch it!"
        
def patch(self):
    print "Modifies patch!"
    
Monkey_patch().patch()
Monkey_patch.patch = patch
Monkey_patch().patch()

python的namespace是开放的,通过dict来实现,所以达到patch比较容易。

python的namespace有:
1、locals
2、globals
3、builtin


一篇介绍eventlet的文章:Http://www.cnblogs.com/Security-Darren/p/4170031.html

下面来看下eventlet.monkey_patch怎么用?

wKioL1X4zqjRAErxAAHlw1xdnaM335.jpg

从上面可以看到:

eventlet.monkey_patch()  # 默认不加任何参数的情况下,是所有可能的module都会被patch。

# 看个例子
In [2]: eventlet.monkey_patch
Out[2]: <function eventlet.patcher.monkey_patch>

In [3]: eventlet.monkey_patch()

In [4]: import ti
time    timeit  timing

In [4]: import time
time    timeit

In [4]: import time

In [5]: eventlet.patcher.is_monkey_patched('time') # 查看一个module是否被monkey_patch,eventlet.patcher.is_monkey_patched(module)
Out[5]: True

In [6]: import sys

In [7]: eventlet.patcher.is_monkey_patched('sys')  # 说明eventlet没有对sys的patch
Out[7]: False

注:在程序中越早调用monkey_patch()越好,通常作为模块的第一行代码(避免子类继承父类的时候,父类还没被monkey_patch)


模块被monkey_patch后的好处:

[root@controller-39 tmp]# cat monkey_patch_test.py
#!/usr/bin/env python
import eventlet
eventlet.monkey_patch()

from eventlet.green import urllib2
import time

urls = ["http://www.tudou.com",
        "http://www.baid.com"
       ]
         
def test_1(url):
    try:
        print "open tudou"
        time.sleep(5)
        urllib2.urlopen(url).read()
        print "done open tudou"
    except urllib2.HTTPError:
        return
        
def test_2(url):
    try:
        print "open baidu"
        urllib2.urlopen(url).read()
        print "done open baidu"
    except urllib2.HTTPError:
        return
        
pool = eventlet.GreenPool(100)
pool.spawn(test_1, urls[0])
pool.spawn(test_2, urls[1])
pool.waitall()    # 等待所有绿色线程执行结束

当test_1中time.sleep被调用到时,会将运行权利交给了hub,然后接着执行test_2,如果不使用monkey_patch的话time.sleep(1)会阻塞。
你可以注释掉eventlet.monkey_patch()这行代码,然后再看下运行结果。


openstack项目中大量用到了monkey_patch

[root@controller-39 tmp]# grep -n -r "eventlet.monkey_patch" 
/usr/lib/python2.7/site-packages/neutron/agent/netns_cleanup_util.py:19:eventlet.monkey_patch()
/usr/lib/python2.7/site-packages/neutron/agent/l3_agent.py:20:eventlet.monkey_patch()
/usr/lib/python2.7/site-packages/oslo/messaging/_cmd/zMQ_receiver.py:18:eventlet.monkey_patch()
。。。。。。



--结束END--

本文标题: python monkey_patch浅

本文链接: https://lsjlt.com/news/189354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python monkey_patch浅
    最近做了一个neutron集成vyatta的任务,顺便认真学习下neutron的代码,头几行就看到了monkey_patch。首先就从neutron-server的启动脚本开始:[root@controller-39 ~]# cat /us...
    99+
    2023-01-31
    python monkey_patch
  • Python深浅copy
    深copy和浅copy 深copy:不仅copy变量的指针,还copy指针指向的数据 这里需要提到一个新名词,指针:变量和内存中数据的一种引用关系。变量通过指针对应到内存中的数据 在列表、元组、字典、集合中可以使用深copy li...
    99+
    2023-01-31
    深浅 Python copy
  • python yield浅析
    在python(本文python环境为python2.7)中,使用yield关键字的函数被称为generator(生成器)。故为了了解yield,必然先要了解generator,而了解generator之前,我们先要了解一下迭代。 递归和迭...
    99+
    2023-01-31
    python yield
  • python setup.py 浅析
    setuptools.setup() 参数说明 packages 对于所有 packages 列表里提到的纯 Python 模块做处理 需要在 setup 脚本里有一个包名到目录的映射。 默认对于 setup 脚本所在目录下同名的目...
    99+
    2023-01-31
    python setup py
  • Python深浅拷贝
    深浅拷贝深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。数字和字符串对于数字和字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。# 导入copy模块>>> i...
    99+
    2023-01-31
    深浅 Python
  • python中Return浅析
       return 语句是Python语言中函数返回的一个值,每个函数都应该有一个返回值;其中,return返回值可以是一个数值,一个字符串,一个布尔值或者一个列表。    Python 函数返回值return ,函数中一定要有...
    99+
    2023-01-31
    python Return
  • python simplejson模块浅
    一、背景知识JSON:引用百科描述如下,具体请自行搜索相关介绍:    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd ...
    99+
    2023-01-31
    模块 python simplejson
  • 浅谈Python之Django
    目录工具版本创建工程djangostart创建项目message创建一些辅助目录连接数据库(保证自己的数据库已启动)生成数据表总结工具版本 python版本:3.8 djang...
    99+
    2024-04-02
  • 浅谈python迭代器
    1、yield,将函数变为 generator (生成器) 例如:斐波那契数列 def fib(num): a, b, c = 1, 0, 1     while a <= num: ...
    99+
    2022-06-04
    浅谈 迭代 python
  • 浅谈Python协程asyncio
    一、协程 官方描述; 协程是子例程的更一般形式。 子例程可以在某一点进入并在另一点退出。 协程则可以在许多不同的点上进入、退出和恢复。 它们可通过 async def 语句来实现。...
    99+
    2024-04-02
  • python的深浅拷贝
    copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。对于不可变对象而言,浅拷贝只是引用赋值。 deepcopy函数是深拷贝,对于可变类型,深拷贝是逐层进行拷贝。对于不可变类...
    99+
    2023-09-03
    python 开发语言
  • python之深浅拷贝
    深浅拷贝对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。import copy# ######### 数字、字符串 #########n1 = 123# n1 = "age 10"print(id(n...
    99+
    2023-01-31
    深浅 python
  • Python-浅谈Python2与Pyt
    在Python2版本中编写类时,默认不加载object。那加载object和不加载object的区别在哪里呢?   一是拥有的高级特性不同。 继承object可以拥有许多高级特性,这些高级特性是编写框架和大型项目时需要使用的,十分有用。 ...
    99+
    2023-01-31
    浅谈 Python Pyt
  • 浅谈Python之Django(二)
    目录django设计数据表生成与修改各APP models设计users models 设计course models 设计organization models 设计operati...
    99+
    2024-04-02
  • 浅谈Python之Django(三)
    目录django-admin基本介绍激活django-admin创建访问django-admin的超级用户访问django-admin修改django-admin为中文修改djang...
    99+
    2024-04-02
  • 浅谈Python之Django(四)
    目录1.pip3 install xadmin2.解决方案3. 修改配置文件setting.py中的INSTALLED_APPS4.修改urls中的路由5.访问6.设置显示的字段与搜...
    99+
    2024-04-02
  • Python高级:细说Python浅拷贝
    0.说明         先看看浅拷贝的概念:浅拷贝:对一个对象进行浅拷贝其实是新创建了一个类型跟原对象一样,其内容还是原来对象元素的引用,换句话说,这个拷贝的对象本身是新的,但是它的内容不是        序列类型对象的浅拷贝是默认类型拷...
    99+
    2023-01-31
    高级 Python
  • 浅谈python中的多态
    目录一、多态二、多态性三、鸭子类型一、多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等。(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal(met...
    99+
    2022-06-02
    python 多态
  • 浅谈python中set使用
    浅谈python中set使用 In [2]: a = set() # 常用操作1 In [3]: a Out[3]: set() In [4]: type(a) Out[4]: set...
    99+
    2022-06-04
    浅谈 python set
  • 浅谈Python魔法方法
    特殊方法一览 在 Python 的学习和使用过程中, 你一定碰到过一些 特殊方法, 它们开头和结尾都有两条下划线, 也叫魔法方法 (Magic method), 或者 Dunder...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作