栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

python中的Monkey Patching:何时需要?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python中的Monkey Patching:何时需要?

猴子修补程序是一种在后台进行全局更改的方法,可以使现有代码继续运行,但行为有所更改。

更改内置
str
命令的行为的一个非常简单的示例:

b.py

def foo(msg):    s = str(msg)    print s, type(s)

py

import bb.foo('foo')# monkey-patch import __builtin____builtin__.str = unipreb.foo('foo')# Results:#foo <type 'str'>#foo <type 'unipre'>

a
模块已
str
通过打补丁以
unipre
代替使用该命令,从而修改了其他代码的行为。由于我们假装无法访问
b.py
的代码,因此这是必要的。它可能是一个巨大的程序包,我们只能使用它并且不能更改。但是我们可以插入新的代码来更改行为。

[来自gevent的](http://www.gevent.org/intro.html#monkey-

patching)真实示例

>>> import gevent>>> from gevent import socket>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]>>> gevent.joinall(jobs, timeout=2)>>> [job.value for job in jobs]['74.125.79.106', '208.77.188.166', '82.94.164.162']

上面的示例使用gevent.socket进行套接字操作。如果使用标准套接字模块,则完成DNS的请求将是顺序的,因此将花费3倍的时间才能完成。在greenlets中使用标准的套接字模块会使gevent变得毫无意义,那么在套接字之上构建的模块和软件包又如何呢?

那就是猴子修补的目的。
gevent.monkey中的函数会用其对应的对等仔细替换标准套接字模块中的函数和类。这样,即使不知道gevent的模块也可以从在多greenlet环境中运行受益。

>>> from gevent import monkey; monkey.patch_socket()>>> import urllib2 # it's usable from multiple greenlets now


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/626052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号