AttributeError: 'func_wrapper' object has no attribute '__name__'

每当初的2017年里,我开了一个新的栏目,叫《无用功》。在当下同多元之著述被,李陌会永远呆在一个叫定福居的酒店里,和老三只朋友——大飞机、史三多、东北猫——一起,大开酒戒。

据此意见落于了SimpleXMLRPCServer和zerorpc上。
关于个别的牵线于链接里都能收看,就大概比较一下优缺点把。

当飞机将着陆,广播里开于乘客等播报踏上陆地后的注意事项时,夏乐才恍然惊醒。他任着广播,心中不禁有些迷惑,自己只是是微睡了会儿而已,怎么飞机就开降低了?等及看了同一双眼时间,才知晓过来,自己认为的立即一阵子小睡,竟然足足有少数只多小时!真是如出一辙会好睡眠,居然连个梦没有做。不过好处是判的:经过就等同觉,他觉得自己的大脑便如给格式化后重新安装了扳平整,清爽、纯净、而且动力十足,内存满满。

def startRPCServer():
    s = zerorpc.Server(RPCServer())
    s.bind('tcp://0.0.0.0:' + RPC_PORT)
    s.run()

if __name__ == '__main__':
    from django.utils.autoreload import main
    main(startRPCServer)

使第三独问题是,在案发后闫晓冬的反常表现。

class RPCModuleA(object):
    ...

class RPCModuleB(object):
    ...

class RPCServer(RPCModuleA,
                RPCModuleB):
    ...

闫晓冬所当的地方,名叫昆界滨海度假村,位于海海岸的限度。夏乐带在小呆上了租来的汽车,设定好目的地后,便舒舒服服地于座椅及一样靠,眼睛透过车窗看正在车外的色,听着音乐,任由汽车自己当自动行驶线上,向着目的地疾驰而去。一个多钟头后,汽车驶入了平切开稀疏的椰子林中,在一个站在保护的院子门口停了下来。夏乐于她们出示出位后,便在他们的引下,穿过一长长的绿荫如因之车道,这才上了度假酒店,在一个表面原始部落一般的建造前已了下来。立刻,便产生雷同誉为穿在奇异的门童朝汽车运动来,帮着打开车门,彬彬有礼地等正在夏乐和小呆下车之后,一边好奇地扣押在小呆,一边满脸笑容地拿领进了建的大门。

  1. 老是换代代码都如再开一任何服务,能无克autoreload?
  2. 更开服务是简约,但是时碰到client把端口占住了,RPCServer关了不畏从头不了了。

“夏-警官-中午-好。”小呆说着,眼睛一样闪一扭的。

前期于路面临运用的RPC服务就只有只是发生几个小类,一个主类,然后命令执行一跑,往后台一放,OK了。
以简练的求下,RPC服务的下压力不赛,调用不累,这样的构造都够了。
唯独随着依赖RPC的事情愈发多,问题啊就一点一点暴露出,首先就是是调剂的题目。所有rpc服务都见面将server端抛来的好返回给client端,但是要是是一个非会见废弃大的BUG呢?
本人虽赶上这么一个题材,只是更新数据库里的相同条记下,但是可招错了参数,导致错误的记录受更新了。通常的代码里,我们打独断点或者当函数里打个日志输出一下参数和归值就是实行,但是于这边我们会面临2只问题:


代码里我们能收看我对RPCServer的有着为非下划线开头的函数(包括继续而来的)都卷入了平等尽并替换掉了原本函数。但是func_wrapper(func)是一个instance,不是函数,也不怕未可知盖函数形式调用。了解python的同桌应该知道,python的built-in函数callable可检查一个object是否好以函数形式调用,看一下文档(python2
callable)纵使能够明了class
instance如果有__call__函数就会为调用。那就就是很简短了,我们抬高这个函数并在其间调用原先的函数对象,然后将我们关心的函数誉为,参数,返回值都于出去,就比如这样:

“好吧,我再次同不良忘记了若是个机器人。”夏乐无奈地游说了一样句,然后因他相同挥手,“走吧,咱们租辆车,出发去度假村抓人。”

class func_wrapper(object):

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        result = self.func(*args, **kwargs)
        print(self.func.__name__, args, kwargs, result)
        return result

重复察看小呆,它却一点儿为无变化,依旧如只垃圾桶一样一动不动地矗立那里,直到夏乐叫了相同名声它的名字,它的眼睛一样亮,从休眠状态被激活了。

第二独问题亟待解释一下,测试时client和server都以一如既往台主机及,client端为了节省资源,把rpcclient对象一直保持住,避免频繁建立连接。发布到生育环境时基本未会见如此处理,但是我们毕竟还是创业初期,服务器资源也杀紧张,难免遇到多独服务配置在平台机械及之时节,所以这个题材还是用解决的。

夏乐看就事情发生来怪,但问题之答案,却可能只有当事者自己掌握了。

django用manager.py
runserver来启动为是用的autoreload来监测文件变化。这样既会占据住端口,又能够不管缝更新代码。
可是事实上应用时还是生硌多少题目。如果你利用Sublime
Text的REPL包来运行python脚本的话,当你把REPL
tab关掉后不会见如您所思的一致将占端口的过程也杀掉。其中的缘由我思是以autoreload起了2单过程,一个进程监测文件,一个进程是咱们实际的RPCServer,而关闭tab只是关了监测进程而已。关于这还尚未啊解决办法,日后来法子了更来更新吧。

率先,从闫晓冬的学历与经验来拘禁,他应是独具局部法律常识和极致基础之倒侦察能力的。但据悉犯罪现场的事态,基本得以断定有:嫌疑人于犯案后,既无对准犯罪现场进行伪装,也从没准备毁灭犯罪证据。为什么会这么?是从来不会?还是尚未悟出?还是知难而进放弃?

虽比如这样:

稍稍呆听了,身上产生来阵阵微小的摩擦声,从身体底部伸出来四单脚轮,紧紧地以及当夏乐身边,朝机场的租车处移动去。

class func_wrapper(object):

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        result = self.func(*args, **kwargs)
        print(self.func.__name__, args, kwargs, result)
        return result

    @property    
    def __name__(self):
        return self.func.__name__

class RPCServer(RPCModuleA,
                RPCModuleB):

    def __init__(self):
        super(RPCServer, self).__init__()
        for func_name in dir(self):
            if not func_name.startswith('_'):
                func = getattr(self, func_name)
                if callable(func):
                    setattr(self, func_name, func_wrapper(func))

缓过气来的夏乐,透过机场的充分玻璃窗,朝外面望了于,只见外面成排的椰子树,就比如一个个身材苗条的妻妾一般,一蔸棵摇曳生姿、风情万种。真的是老天地下,换了红尘。夏乐一边好奇地扣押正在窗外的色,一边匆匆地奔使提取处赶去,他可免思在这大笼子一般的飞机场里需要太遥远,好爱来平等差地方世界,来的还是当时栋海滨胜地,他可是免思拿多同区划多一模一样秒的时浪费在航站里,更何况,自己还有任务在身呢。

优点 缺点
SimpleXMLRPCServer python自带库,不用额外安装 数据包大,速度慢
zerorpc 底层使用ZeroMQ和MessagePack,速度快,响应时间短,并发高 额外安装,文档不多

深陷遐思的夏乐,脑海里发在一帧帧海洋之画面,仿佛被了催眠般,在不知不觉中睡觉去矣……

  1. RPC服务好有或于其它一样大主机及,甚至是线达服务器,不能够停机调试
  2. 事关到之函数可能持续一个,考虑到下会产生更多的函数,不可能以每个函数里还重新相同尽打日志的代码,那会十分笨

“为了-更-好-地-执行-任务-设计师-会-在-我-的-数据库-里-输入-你-的-行为-和-语言-模式-所以……”

而有误,欢迎指正。

巾帼首先同呆,接着就将她们带及了营办公室。说明来意后,经理进入其间系统,略一查询,便确定了闫晓冬的职——二十分钟前,他乘坐同一部旅游车去了海滩。接着,经理就被了同名保安,亲自杀,带领正夏乐和小呆,上了同一部观光车直奔海滩。

还是本机测试,结果zerorpc性能要后来居上10%-20%,加上ZeroMQ和MessagePack带来的优势,所以选择了zerorpc。

如此一个人口,怎么会涉嫌杀人吗?在昨晚先是不好读到外的资料时。他便针对这个题目深感迷惑。很引人注目,闫晓冬是只头脑非常灵活,甚至好说凡是有点灵活了了腔之总人口。这样一个心血转得较车轮快之人头,怎么可能波及出杀人这种蠢事呢?而起现场的状来拘禁,很可能是鲜人数在酒后突发肢体冲突所招的意外身故。虽然如此的作业并无少见,但有在个别个受了高等教育的人数身上,就少有多矣。那么,当时于1807室究竟出了哟,竟然于二人数之心绪失控至此?

乘胜项目的前行,除了业务所在的WebService之外,有矣间系统的事务需要,涵盖客服财务统计报表等,在项目子系统首中能顾详细的介绍。今天当此间而说之是系统内的桥梁:RPC(Remote
Procedure
Call)

想到这里,夏乐决定临时不再为这些东西劳神了,反正抓及闫晓冬晚,他协调会解释的。而现更幽默之一个题目是:生活在地方世界,会是什么感觉?而实在的深海,是何等的也罢?古诗中所写的“惊涛拍岸,卷从千积聚雪”,真的不是古人之设想吧?毕竟,各种视频里的海洋,怎么看,也都同鱼缸里之水差不多,所谓波澜与壮观,只能去想象,而望洋兴叹去感受。那究竟会是怎么的一番青山绿水吧?

约莫上关于zerorpc的行使就是到这边了,项目之体量还不一定生及需要分布式RPC服务。虽然自己那个想念尝试,但是或许得后才发时机了。除了上述说及之情节之外还开了有些输出重定向的劳作,用于其他的日记输出,里面有些打印调用栈的知识点,就以此后有关python技巧的章里又说吧。

海滩上人口并无多,稀稀疏疏、三三两两的,或当海边散步,或以伞座下休息。而那同样名气又平等名誉声声不息的海浪声,仿佛是一模一样首来自大自然的催眠曲,不但驱逐了滚滚的燥热,也松了人人的情绪。第一坏以真正的近海,听到这大海的动静,夏乐心中不禁陶然,恨不得马上向到浅滩上,与那频频冲刷着正在沙岸的巨浪嬉戏一番。然而,还没当客于那抹无由要分外的乐中拨喽神来,经理以及护卫都发现闫晓冬了,此时此刻,他正在同暨阳伞下之睡椅上,悠闲地扣押正在海洋,对于将赶到之夏乐等丁,似乎毫不防范。

class func_wrapper(object):

    def __init__(self, func):
        self.func = func

class RPCServer(RPCModuleA,
                RPCModuleB):

    def __init__(self):
        super(RPCServer, self).__init__()
        for func_name in dir(self):
            if not func_name.startswith('_'):
                func = getattr(self, func_name)
                if callable(func):
                    setattr(self, func_name, func_wrapper(func))

于过去的2016年之一个夜晚,我开了一个荒诞而破的梦幻,现在,我打算将这梦记下来,并拿忘记的部分与剩下的有些补齐,让其成一个持久的故事。如果您想看一个关于同一曰天才画家与同一独自猫,一段子探险和相同宗命案的荒唐故事,就足以点开这里:《异世界传奇(第一总统):林家别墅古怪杀人案》。

是的,RPC
server需要拿具有函数叫都暴露被client,把原来的函数替换了可名字没留,自然是如错。修改一下,很简短:

遇难者叫苏涛,是平下商业咨询公司的数据统计员,年龄是37夏,未婚,独居,没有犯法前科,也未曾其余的软信用记录。虽然还有几笔不完全还的信用消费,但为可以算得上是一律誉为奉公守法了。

实际上就为非是啊新鲜的定义,上世纪70年代就提出过理论,80年间就实际上应用了。RPC多是用于对安排于任何主机或者网络空间的劳务之求。所以比作系统间的桥梁也是于适中的。

自打机舱里倒下,耳朵里之痛还免完全散尽,一抹灼人的热浪便已经扑面而上,并随即用夏乐包裹起来。这不行地方!他不由自主以心尖暗骂一句,拎着背包,循着指示牌,直奔机场更衣室而失去。排了半天队,终于换好了平身宽松的短衣短裤后,夏乐长长地出了一口气:总算是活着过来了,从下飞机自,简直就是像是倒上前了蒸锅里,时刻都产生同栽自己而于蒸熟的感到。相比起来,气压升高带来那么片不凑巧,实在是算不了什么了。

解决办法是以了django.utils.autoreload模块,它把少单问题都解决了。

相对而言起。嫌疑人闫晓冬就没这样简单了。他比较苏涛小9载,在朗诵大学之时光,曾经非法上学校的学籍管理网,更改好的考试成绩,结果被该校给重警告的处分。从学毕业后,先后当多下公司当程序员,在短短的四五年里,换了七八份工作。而于做事的余,他要一个闻名的黑客组织“鼹鼠”的积极分子。但看起,他当该团伙遭到既未活跃,也未曾什么作为,所以,倒是从没有引起了累。总之,这个闫晓冬算是一个微小离经叛道,却并无绝特殊的人士。

于zerorpc的利用方法可以望我们只有待提供一个蕴含有函数的instance,因此此越适合用函数按模块划分,并出于一个主类(MainClass)多又继承而来。

夏乐的笑颜立刻僵住了,“这话是哪个叫你的?”

[server端代码]
import zerorpc
from SimpleXMLRPCServer import SimpleXMLRPCServer

class RPCServer(object):
    """docstring for RPCServer"""

    def __init__(self):
        super(RPCServer, self).__init__()
        self.data = {str(i): i for i in range(100)}
        self.data2 = None

    def getObj(self):
        print('get data')
        return self.data

    def sendObj(self, data):
        print('send data')
        self.data2 = data
# zerorpc
s = zerorpc.Server(RPCServer())
s.bind('tcp://0.0.0.0:4243')
s.run()
# SimpleXMLRPCServer
server = SimpleXMLRPCServer(('localhost',4242), allow_none=True)
server.register_introspection_functions()
server.register_instance(RPCServer())
server.serve_forever()

[client端代码]
import zerorpc
import time
import xmlrpclib

# zerorpc
def zerorpc_client():
    print('zerorpc client')
    c = zerorpc.Client()
    c.connect('tcp://127.0.0.1:4243')
    data = {str(i): i for i in range(100)}
    start = time.clock()
    for i in range(5000):
        c.getObj()
    for i in range(5000):
        c.sendObj(data)
    print('total time %s' % (time.clock() - start))

# SimpleXMLRPCServer
def xmlrpc_client():
    print('xmlrpc client')
    c = xmlrpclib.ServerProxy('http://localhost:4242')
    data = {str(i): i for i in range(100)}
    start = time.clock()
    for i in range(5000):
        c.getObj()
    for i in range(5000):
        c.sendObj(data)
    print('xmlrpc total time %s' % (time.clock() - start))

闫晓冬意识到了身边的景象,便直起了身,伸手从一旁的案上拿起那听喝了一半之啤酒,啜了同人,脸上露出了同一丝笑容。

好了,这样便水到渠成了俺们对每一样不善调动用都将函数叫作,参数,返回值由有日记的目的了。
但这尚从未得了。项目是更加开越来越老之,新题材是进一步多的。随着rpc服务之始末变多,新出现了2只问题:

辅助,案发后,嫌疑人怎么未采用手段隐蔽自己的行踪,以达躲避警方的追查。正常情况下,犯罪分子都见面抱持一些侥幸心理,用一味道伪造身份,想只要蒙混过关。但闫晓冬却从不如此做,而作为同一号称黑客团队的分子,他肯定比普通人还发生此力量。这为即,他连无准备逃脱。这样问题便来了,既然他莫打算逃跑,那为何未去自首。如果他以案发后主动自首,同时能证实自己案发时处于醉酒状态以来,很可能会见收获便利团结的判决。但如今,他既是未打算逃跑,又尚未错过这自首,他图的是什么啊?

新生工作达到同时新增了NodeJS的服务,同样需请业务服务器的多寡,相比HTTP请求,RPC消耗的资源再次少,这时便挺庆幸最初选择了zerorpc,因为她还会无缝兼容javascript。

“我-一-进入-机舱-就-进入-了-休眠-状态-所以-没有-感觉。”

调研时协调写了一个workbench,把代码贴上来。

下一节

雅好,这样目的上了,运行一下咔嚓。。。呵呵!报错了。

上一节

就此需要一个简约的不二法门能由有富有的调用请求、参数和归值。
哼于咱们为此之凡python。 so let’s do it in python way.
咱们且晓得python instance在初始化时调用的凡 __init__
函数,因此我们可以备父类的__init__
函数执行完后本着这instance做来小动作。

回目录

咱俩的政工系统以及其中系统都是由Django搭建的,所以rpc服务明显也是如物色支持python语言的。其他语言下的精粹框架很多,也非是说勿可知用,但是不用任意增加项目的技能复杂度(Python和任何语言的协同使用)。

为了预防他远走高飞,夏乐给经和保护分别行动,和调谐做一个三角,一步步往闫晓冬围去。小呆则收于了脚轮,又打最底层伸出一个几和身围相当的半圆形,在松软的三角洲上,滚动着,一步不牵扯地跟在夏乐身边。

小呆的说话还并未说得了,夏乐也着为协调的自讨没趣懊悔着,一个身材修长、穿在制服,脚上登在高跟鞋的娘以她们面前站住了,一体面微笑地看正在夏乐,似乎以等正他主动提问。夏乐赶忙从刚的尴尬遭遇掉喽神来,对它商量:“我是警察,来索一个口。”说罢,从口袋里拿出了协调之关系,在它们面前一晃。

小呆的眼睛闪了闪,说道:“我-被-这样-设计-是-为了-跟-你-更-相配-。”

“唉,又是就无异于词。”夏乐无奈地叹息了人数暴,忍不住问道,“怎么样,小呆,飞了合伙感觉如何?”

尽管表面看起老而简陋,但建筑之中间,却是豪华而现代,除了有些忙前忙后,走来走去地啊客人提供各种帮扶的劳动人员外,便是应有尽有的自助服务设施,以及一台台叫设计得光鲜炫目、线条圆润的机器人,有的以输行李,有的以清洁卫生,还有的当休憩区之吧台里,忙来忙去地调制着各种饮品……环顾着大厅里的种情况,夏乐忍不住手指着那些忙来忙去的机器人,笑眯眯地对小呆说道:“你瞧人家一个个大抵优质,怎么你虽这样黑不溜秋傻呆呆的,像只垃圾箱一样也?”