猴子修补程序是一种在后台进行全局更改的方法,可以使现有代码继续运行,但行为有所更改。
更改内置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



