什么是猴子補丁(monkey patch)


monkey patch指的是在執行時動態替換,通常是在startup的時候.
用過gevent就會知道,會在最開頭的地方gevent.monkey.patch_all();把標准庫中的thread/socket等給替換掉.這樣我們在后面使用socket的時候能夠跟尋常一樣使用,無需改動不論什么代碼,可是它變成非堵塞的了.
之前做的一個游戲server,非常多地方用的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來替換.





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM