python3d游戏引擎,python游戏开发引擎
所有与firefly可访问性相关的文件都存储在utils文件中,即“工具”模块。
utils模块的文件结构-utils-_ _ init _ _。py-interface . py # interface class-service . py # service class-singleton . py # singling特别是工具
这个类几乎贯穿了整个分布式布局,是firefly的重要元素。
首先,让我们看看服务类在做什么。# Coding: utf8 创建于2011年1月3日Service Class @ Author:Sean _ LAN importthreadingfromthed . iii threadfromtwistwion 360 AremotingServiceAttribute s 3360====Service name。* runstyle #在这里,我认为作者应该提供两种执行方式。#以单线程模式运行的服务是定义的对象或延迟服务,无法执行耗时的同步任务。因为它会阻塞整个服务线程。#多线程模式在这种模式下,服务会以扭曲的多线程滞后回调模式运行,甚至可能导致软件崩溃。软件返回的必须是同步对象。返回异步对象也会导致软件异常或崩溃。这里应该有足够的关于使用twisted的知识。如果没有,相关文档SINGLE_STYLE=1 #单线程执行PARALLEL_STYLE=2 #多线程执行def __init__(self,name,Run style=single _ style (:self。_ name=name #服务名称self。_runstyle=runstyle #运行模式self.unDisplay=set) #目标服务字典# KeepScoftTargetsInternallydef _ ITER _ { Self } 3360返回自我。_目标。}所有服务defaddundisplaytargets命令(:#)(addtargetUndisplaywhenclientCallit。)(自我。Undisplay.add)命令)定义服务黑名单注册服务 addtargettotheservice。自我。_ lock.acquire () Try: key=target。_ name _ ifkeyinself。_ targets3360exist _ target=self。_ targets.get (key)提升“配置”配置目标。__name__)自己。_ targets[key]=目标最终3360 self。_ lock . release(defunmaptarget)self,Target): # Unregister服务 RemoveTargetFromtheservice 自我。_ lock . acquire()try 3360 key=target。_ nameFinally:自我。_ lock.targetkey(:)基于服务名" " RemoveTargetFromtheservice。”“自我。_ lock.acquire。
etKey]最后:自我.锁定。release()def get target(self,targetKey): #获取服务按名称从服务中获取目标。自我. try: target=self ._targets.get(targetKey,None) finally: self ._lock.release()返回目标定义调用目标(self,targetKey,*args,**kw): #调用服务调用 Target @ param conn:client connection @ param Target key:Target ID @ param data:client data 如果自我._runstyle==self .SINGLE _ STYLE:结果=自身。callTargetSingle(targetKey,*args,**kw)else:result=self。calltargetparallel(目标键,*参数,* * kw)返回结果def callTargetSingle(self,target key,*args,**kw): #用单线程方式调用服务通过单个@param conn调用目标:客户端连接@param targetKey:目标ID @param数据:客户端数据 目标=自己。获取目标(目标密钥)本身._ lock。acquire()try:if not target:log。呃(在服务上未找到命令 str(targetKey)如果目标键不在自身中,则返回没有。不显示:日志。消息(在服务单身上调用方法% s)%目标._ _ name _ _)defer _ data=target(* args,* * kw)if not defer _ data:is instance(defer _ data,defer)则返回没有.deferred):return defer _ data d=defer .deferred()d . callback(defer _ data)finally:self ._ lock。release()return d def调用目标并行(self,targetKey,*args,**kw): #用多线程方式调用服务通过单个@param conn:客户端连接调用目标@param targetKey:目标ID @param数据:客户端数据 自我._ lock。acquire()try:目标=自身。如果不是target:log,则获取目标(目标键)。呃(在服务上找不到命令str(目标关键字)不返回任何日志。消息(在服务平行上调用方法% s) % target ._ _ name _ _)d=线程。延期线程(目标,*参数,* *千瓦)最后:自我._lock.release()返回dclass命令服务(服务): 远程处理服务继承于服务类,主要用于指令服务(当客户端数据被解析成指令后可以直接根据指令内容调用服务)这里要求客户讲注册到本服务对象的服务名称写成name_commandId比如:getUser_01,当我调用一号指令时,会自动解析成这个函数名称。
定义映射目标(自身,目标): 向服务添加目标。自我.锁定。acquire()try:key=int((target .__name__).split(_)[-1]) #分割函数么,并取第二段如果键入自我._目标:#注册分割出来的函数ID exist_target=自我 targets.get(key) raise 目标[%d]已经存在,\ n在%s和%s%(key,exist_target .__name__,target .__name__)自己. targets[key]=最终目标:自我._ lock。release()def un mapTarget(self,Target): 从服务中删除目标。自我.锁定。acquire()try:key=int((target .__name__).如果键入自我,则拆分( _)[-1])。_目标:del self ._targets[key]最后:自我. lock.release()第二步,我们看一下单例模式(singleton.py) #这个文件提供了大蟒单例模式的元类# 至于什么是单例模式,什么是元类,笔者就不做详细描述了# 基本原则是,单例模式一般用于配置文件# 单例模式的特点是在一个进程中,无论被实例化几次,都不会重新创建对象,而始终是第一个对象,这样既能保证配置文件在一个程序中的唯一性,类似于全局变量# 这一块,如果无法理解也没有关系,可以直接跳过,你可以吧单例模式产生的类实例化的对象当成一个全局类,里面的变量当成全局变量。类Singleton(类型): Singleton元类 def __init__(self,name,bases,dic): super(Singleton,self).__init__(name,bases,DIC)self . instance=None def _ _ call _ _(self,*args,**kwargs):如果自我。情况为无:自我。instance=super(单例,自身).__call__(*args,* * kwargs)返回self。实例类测试(元类=单例):#指定创建富(中国姓氏)的类型为单例类型def _ _ init _ _(self):self。JSON _ config=无最后,我们再来看看interface.py文件# 这个作为一个接口类,以该类为接口的类必须要完成该类所提供的方法,否则会报错创建于2013-10-17 @作者:兰(www。9苗。com) 来自_ _ future _ _ import部门,absolute _ import来自Zope。接口导入接口类idata pack协议(接口):def getHeadlength(): 获取数据包的长度传递定义解包(): 解包定义包(): 打包数据包
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。