什么是猴子补丁

什么是猴子补丁,第1张

你好,很高兴为你解答。猴子补丁的由来首先说个我自己的笑话,话说Python算是我接触的稍微深点儿的第一门动态语言,用Python没多久就知道了有个Gevent,学习Gevent没多久就知道有个“猴子补丁”的概念。最开始觉得这么名字挺乐呵,猴子补丁,为啥叫这么个名儿?是因为猴子的动作迅速灵敏,Gevent也有这个特点,所以叫猴子补丁么?然后这几天在看《松本行弘的程序世界》这本书,里面专门有一章讲了猴子补丁的设计,我就笑了,原来猴子补丁不是我理解的这个意思,更不是Gevent最开始这么做的。所谓的猴子补丁的含义是指在动态语言中,不去改变源码而对功能进行追加和变更。猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的写成了gorllia(猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。从Gevent学习猴子补丁的设计猴子补丁这种东西充分利用了动态语言的灵活性,可以对现有的语言Api进行追加,替换,修改Bug,甚至性能优化等等。比如gevent的猴子补丁就可以对ssl、socket、os、time、select、thread、subprocess、sys等模块的功能进行了增强和替换。我们来看下gevent中的猴子补丁模块gevent.monkey的设计和实现,以后如果自己要设计实现猴子补丁,也可以按照这么个模式去做,我最近比较喜欢用ipython来阅读python模块的代码,执行importgevent.monkey之后,只需要输入??gevent.monkey就可以查看源码了。这个模块核心的函数其实就这几个,这些函数都位于模块的上方,get_original、patch_item、remove_item、patch_module还有一个全局弊宴变量叫做saved,默认指向一个空的字典对象。首先来看patch_item函数的实现:defpatch_item(module,attr,newitem):NONE=object()olditem=getattr(module,attr,NONE)ifolditemisnotNONE:saved.setdefault(module.__name__,{}).setdefault(attr,olditem)setattr(module,attr,newitem)这个函数的功租山银能就是从指定模块中查找旧的项,并把旧的项保存到saved字典中,然后将旧项替换成新项。这里没有使用None,而是构建了一个空的object()作为默认属性,是NullPointer模式么?然后是patch_module的实现:defpatch_module(name,items=None):gevent_module=getattr(__import__('gevent.'+name),name)module_name=getattr(gevent_module,'__target__',name)module=__import__(module_name)ifitemsisNone:items=getattr(gevent_module,'__implements__',None)ifitemsisNone:raiseAttributeError('%rdoesnothave__implements__'%gevent_module)forattrinitems:patch_item(module,attr,getattr(gevent_module,attr))gevent有个约定,作为补丁的gevent模块要包含这两个属性,__target__和__implements__,__target__是被补丁的默认模块名称,可以不指定,默唯拦认为gevent子模块的名称,比如gevent.socket是socket模块的补丁,__implements__是要进行补丁的属性,这是gevent.socket模块中__implements__的定义:#standardfunctionsandclassesthatthismodulere-implementsinagevent-awareway:__implements__=['create_connection','socket','SocketType','fromfd','socketpair']patch_module的工作就是从gevent模块里面读取这两个属性,然后遍历调用patch_item进行替换。可是有的时候我们不希望用补丁的东西,而是使用原先的模块去进行处理,该怎么?前面提到过进行patch_item的时候会把旧的属性保存到名为saved的全局字典里面,如果要获得旧的模块属性,那么就要调用get_original函数从saved字典里面取出来。In[6]:sleep=gevent.monkey.get_original("time","sleep")In[7]:sleepOut[7]:In[8]:importtimeIn[9]:time.sleepOut[9]:猴子补丁猴子补丁的功能很强大,但是也带来了很多的风险,尤其是像gevent这种直接进行API替换的补丁,整个Python进程所使用的模块都会被替换,可能自己的代码能hold住,但是其它第三方库,有时候问题并不好排查,即使排查出来也是很棘手,所以,就像松本建议的那样,如果要使用猴子补丁,那么只是做功能追加,尽量避免大规模的API覆盖。希望能帮到你,求采纳。

根据维基百科急购动物猴子说:“鬼门”,这是应用程序猴,酉鸡,狗徐

5行派说阴阳,既猴鸡狗

含金的意思儒家的说法,代表智利猴,鸡代表粗胡任勇狗

代表日本文化的还不是很了解,只能翻译这么多

猿··雉狗

桃太郎は“鬼魂”全鬼妮外抗扩展TE“鬼门”妮位置する动物(沉(热ル),酉(云寺),徐(穗ヌ))を率箕TA, ü谢石と箕但是ある(泷泽马琴'严氏日报“呐ど)。拓展KA扩大丑と贤(勃艮第·ウ善トラ)每るNOHA不是(靴弘吉)と申全反全方向妮(坤·浩靴吉安热ル)であり,申,酉,戌では呐区,高全解釈妮仔雀如何不合理,但あるたは相当,动物的琪琪特茹妮は做意义的速率但あるるともされ。

阴阳说では桃,沉(热ル),酉(云寺),徐(穗ヌ)はどれもを意味する金。

儒解石では,热ルは智慧,去吉は永任绥ヌはをもされ表苏祺德茹。

吉备津神社元从故事分支机构と,吉备津燕命运但是,犬饲全系犬饲健康的生活(箕米糠かた箕るけ米全高と),猩猩喂食部全乐々森焱生活(ささもりひこ全宓阁と),鸟饲部全离开辰雨的生活(と相当たまおみこ弥と)と箕ü三人组满堂と倪总,鬼布鲁诺市妮住む“鬼”である闻螺(U RA)跌したとされ德箕る但是,高满堂たち全逸话を桃太郎设置き妮改变える岩戚拦と“犬养健=狗”“乐々森焱=猿“,”玉辰=野鸡酒店“とと呐するるる说法是你。

摘的数量最少是什么样的情况?我想应该满足:

1,第5只猴子有桃子吃;

2,第5只猴子在醒后吃桃子之前把桃子平均分成了5份,而且还多了一个桃子(隐含意义是第5只猴子吃了2个桃子,剩下4个桃子,这中粗答样才满足摘的数量最少);

那么我们就知道了,最后一个猴子(将猴子数量扩展为未知,猴子数为n)醒后还有n+1个桃子;

第n-1个猴子醒后还有n*(n+1)+1个桃子卖慧

第n-2个猴子醒后还有n*(n*(n+1)+1)+1

以此类推,可由递归算出桃子总凳搜数


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12288119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存