monkey patch指的是在運行時動態替換,一般是在startup的時候.
用過gevent就會知道,會在最開頭的地方gevent.monkey.patch_all();把標准庫中的thread/socket等給替換掉.這樣我們在后面使用socket的時候可以跟平常一樣使用,無需修改任何代碼,但是它變成非阻塞的了.
之前做的一個游戲服務器,很多地方用的import json,后來發現ujson比自帶json快了N倍,於是問題來了,難道幾十個文件要一個個把import json改成import ujson as json嗎?
其實只需要在進程startup的地方monkey patch就行了.是影響整個進程空間的.
同一進程空間中一個module只會被運行一次.
下面是代碼.
main.py
import json
import ujson def monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch_json() print 'main.py',json.__name__ import sub
sub.py
import json
print 'sub.py',json.__name__
運行main.py,可以看到都是輸出'ujson',說明后面import的json是被patch了的.
最后,注意不能單純的json = ujson來替換.