CN109086059B - 代码加载更新方法、装置及服务器 - Google Patents
代码加载更新方法、装置及服务器 Download PDFInfo
- Publication number
- CN109086059B CN109086059B CN201710446714.9A CN201710446714A CN109086059B CN 109086059 B CN109086059 B CN 109086059B CN 201710446714 A CN201710446714 A CN 201710446714A CN 109086059 B CN109086059 B CN 109086059B
- Authority
- CN
- China
- Prior art keywords
- module
- target
- code
- loader
- loading
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/02—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/34—Network arrangements or protocols for supporting network services or applications involving the movement of software or configuration parameters
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明实施例公开了一种代码加载更新方法、装置及服务器,属于软件开发技术领域。该方法包括:获取导入的目标代码模块的模块名称,目标代码模块是用于热加载或热更新的代码模块,目标代码模块采用import机制导入;根据模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器,各个模块载入器对应各自的HTTP站点,HTTP站点用于存储热加载或热更新的代码模块;通过目标模块载入器从对应的目标HTTP站点处下载目标代码模块;通过目标模块载入器将目标代码模块热加载或热更新得到程序中。本发明实施例中只需要利用import机制导入目标代码模块即可,无需设置线程锁,简化了远端加载的操作,提高了远端加载的效率。
Description
技术领域
本发明实施例涉及软件开发技术领域,特别涉及一种代码加载更新方法、装置及服务器。
背景技术
随着Python语言的不断更新和完善,越来越多的大型项目开始采用Python语言进行开发。
为了降低项目维护成本和负担,大型Python项目中通常包含大量热加载或热更新的代码模块。其中,热加载是指程序运行过程中,实时加载并运行新增代码模块的过程;热更新是指程序运行过程中,实时对指定代码模块进行更新的过程。代码模块的热加载或热更新不会影响程序的正常运行,从而避免每次更新时都需要重新部署整体程序代码,降低了项目的维护成本。相关技术中,通常使用Python语言内置的eval函数实现代码模块的热更新和热加载。
然而,当需要热加载或热更新的代码模块存储在远端HTTP(HyperText TransferProtocol,超文本传输协议)站点,并使用eval函数从远端HTTP站点下载代码模块时,需要显示调用相关函数,并设置相应的线程锁,导致进行远端加载的过程复杂,效率较低。
发明内容
为了解决相关技术中存在的问题,本发明实施例提供了一种代码加载更新方法、装置及服务器。所述技术方案如下:
根据本发明实施例的第一方面,提供了一种代码加载更新方法,该方法包括:
获取导入的目标代码模块的模块名称,目标代码模块是用于热加载或热更新的代码模块,目标代码模块采用import机制导入;
根据模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器,各个模块载入器对应各自的HTTP站点,HTTP站点用于存储热加载或热更新的代码模块;
通过目标模块载入器从对应的目标HTTP站点处下载目标代码模块;
通过目标模块载入器将目标代码模块热加载或热更新得到程序中。
根据本发明实施例的第二方面,提供了一种代码加载更新装置,该装置包括:
第一获取单元,用于获取导入的目标代码模块的模块名称,目标代码模块是用于热加载或热更新的代码模块,目标代码模块采用import机制导入;
查找单元,用于根据模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器,各个模块载入器对应各自的HTTP站点,HTTP站点用于存储热加载或热更新的代码模块;
下载单元,用于通过目标模块载入器从对应的目标HTTP站点处下载目标代码模块;
加载更新单元,用于通过目标模块载入器将目标代码模块热加载或热更新得到程序中。
根据本发明实施例的第三方面,提供了一种服务器,所述服务器包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由所述处理器加载并执行以实现如第一方面所述的代码加载更新方法。
根据本发明实施例的第四方面,提供了计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由所述处理器加载并执行以实现如第一方面所述的代码加载更新方法。
本发明实施例中,采用Python原生的import机制导入用于热加载或热更新的目标代码模块,使得查找器能够根据该目标代码模块的模块名称,查找到相应的目标模块载入器,并交由目标模块载入器从对应的HTTP站点处下载相应的目标代码模块,从而将目标代码模块热加载或热更新得到程序中,完成热加载或热更新过程;整个热加载更新过程中,只需要利用import机制导入目标代码模块即可,无需额外调用其他相关函数;并且利用import自带的线程安全机制,避免了设置线程锁,极大的简化了远端加载的操作,提高了远端加载的效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了本发明一个实施例提供的代码加载更新方法的流程图;
图2示出了本发明一个实施例提供的代码加载更新方法的流程图;
图3是图2所示代码加载更新方法所涉及的模块路径拼接过程的流程图;
图4是一个实施例提供的代码加载更新方法的实施示意图;
图5示出了本发明一个实施例提供的代码加载更新装置的结构方框图;
图6示出了本发明一个实施例提供的服务器的结构方框图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
为了方便理解,下面对本发明实施例中涉及的名词进行解释。
代码模块(Module):又称为插件式代码,以插件形式运行在项目程序中(无法脱离项目程序单独运行),用于实现定制化或个性化附加功能,支持热更新和热加载。
查找器(Finder):具有根据模块名称查找相应代码模块的功能,当查找器查找到相应的代码模块时,进一步通过模块载入器将代码模块加载到运行的程序中。本发明实施例中,查找器是自定义的HttpMetaFinder,用于根据模块名称从远端Http站点处查找相应的代码模块。本发明实施例中,查找器中至少实现有find_module方法,通过find_module方法,查找器能够根据目标代码模块的模块名称,确定出代码模块所在HTTP站点的URL,并进一步通过相应的模块载入器从该HTTP站点处获取目标代码模块。
模块载入器(Loader):具有加载代码模块功能。本发明实施例中,查找器是自定义的HttpModuleLoader,用于根据模块名称从HTTP站点处下载相应的代码模块,并将该代码模块编译载入程序,实现热加载或热更新的功能。本发明实施例中,模块载入器中至少实现有get_code方法和load_module方法,通过get_code方法,模块载入器能够从HTTP站点处下载代码模块;通过load_module方法,模块载入器能够将代码模块中的代码编译载入到运行的程序中。
需要说明的是,本发明实施例中,目标代码模块被预先上传到HTTP站点,且查找器和模块载入器均采用相应的Python代码实现,并被预先写入到项目程序中。当通过import机制导入目标代码模块时,即自动调用查找器和模块载入器从HTTP站点下载目标代码模块,从而实现热加载或热更新。
请参考图1,其示出了本发明一个实施例提供的代码加载更新方法的流程图,本实施例以该代码加载更新方法应用于服务器来举例说明,该方法包括:
步骤101,获取导入的目标代码模块的模块名称,目标代码模块是用于热加载或热更新的代码模块,目标代码模块采用import机制导入。
查找器和模块载入器的实现代码被预先写入项目程序中,当开发人员需要对项目程序进行热加载或热更新时,只需要将用于热加载或热更新的目标代码模块上传至HTTP站点,并通过import机制导入目标代码模块,服务器即自动通过查找器和模块载入器从该HTTP站点处下载目标代码模块,并对目标代码模块进行热加载或热更新。
在一种可能的实施方式中,当需要向项目程序中添加实现定制化功能的目标代码模块时,开发人员即将包含目标代码模块的文件new_source.py(与项目程序中已有的代码模块不同名)上传到预定的HTTP站点http://127.0.0.1:15000。后续通过“import new_source”即可导入目标代码模块。
在另一种可能的实施方式中,当需要对项目程序中已有代码片段进行更新时,开发人员即将包含目标代码模块的文件old_source.py(与项目程序中待更新的代码模块同名)上传到预定的HTTP站点http://127.0.0.1:15000。后续通过“import old_source”即可导入目标代码模块,并可以通过“reload old_source”对原有的代码片段进行热更新。
步骤102,根据模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器,各个模块载入器对应各自的HTTP站点,HTTP站点用于存储热加载或热更新的代码模块。
在一种可能的实施方式中,用于热加载或热更新的代码模块被上传到同一个HTTP站点,当获取到导入的目标代码模块的模块名称时,查找器根据模块名称查找到目标代码模块后,进一步通过模块载入器从该HTTP站点处下载目标代码模块。
当代码模块数量较多时,将所有代码模块上传到同一HTTP站点后,查找器和模块载入器在该HTTP站点中进行查找和下载的速度较慢(需要遍历所有的代码模块)。为了提高查找和下载速度,在另一种可能的实施方式中,存在至少两个HTTP站点用于存储代码模块,其中,不同HTTP站点存储的代码模块互不相同,且同一HTTP站点中存储的代码模块的模块名称符合相同的命名特征。查找器获取到目标代码模块的模块名称后,即根据该模块名称确定目标代码模块所在的目标HTTP站点,进而确定用于从该目标HTTP站点处下载目标代码模块的目标模块载入器。
在实际实施过程中,可选的,查找器HttpMetaFinder中定义了find_module方法,具体如下:
def find_module(self,module_name,path=None):
return HttpModuleLoader(self._service_url)
其中,module_name为模块名称,self._service_url为目标HTTP站点的URL,查找器HttpMetaFinder根据module_name,查找到目标模块载入器HttpModuleLoader(与目标HTTP站点对应)。
步骤103,通过目标模块载入器从对应的目标HTTP站点处下载目标代码模块。
通过查找器查找到目标模载入器后,服务器进一步通过目标模块载入器从对应的目标HTTP站点处下载目标代码模块。
可选的,目标模块载入器根据目标代码模块的模块名称和目标HTTP站点的URL,确定目标代码模块在目标HTTP站点的存储路径,从而根据该存储路径从目标HTTP站点处下载目标代码模块。
在实际实施过程中,可选的,目标模块载入器HttpMetaFinder中定义了get_code方法,具体如下:
def get_code(self,fullname):
r=urlopen(self.get_filename(fullname))
source=r.read().decode('utf-8')
return compile(source,self.get_filename(fullname),'exec')
其中,self.get_filename(fullname)用于获取目标代码模块在目标HTTP站点上的存储路径,目标模块载入器HttpMetaFinder即根据存储路径,通过urlopen查询目标HTTP站点上存储的目标代码模块,并在查找到目标代码模块时,通过r.read().decode('utf-8')对目标代码模块中的代码进行读取及编码,从而完成目标代码模块下载。
步骤104,通过目标模块载入器将目标代码模块热加载或热更新得到程序中。
目标模块载入器下载目标代码模块后,即将目标代码模块中的代码编译载入到程序中,从而完成目标代码模块的热加载或热更新。
在实际实施过程中,可选的,目标模块载入器HttpMetaFinder中还定义了load_module方法,具体如下:
其中,exec(code,mod.__dict__)用于执行目标代码模块中的代码。
在一种可能的实施方式中,目标代码模块用于热加载时,对目标代码模块进行热加载过程中,服务器通过目标模块载入器将目标代码模块的代码编译载入程序中。后续调用热加载的目标代码模块时,即可调用目标代码模块中命名空间下的变量或函数方法。
示意性的,目标代码模块new_source如下所示:
class A:
def ok(self):
print("OK")
后续通过new_source.A().ok()即可调用目标代码模块在原有项目程序中实现打印“OK”的功能。
在另一种可能的实施方式中,目标代码模块用于热更新时,对目标代码模块进行热更新时,目标模块载入器根据目标代码模块的代码对程序中的待更新代码模块进行代码更新,并将更新后的代码编译载入程序中,其中,目标代码模块与待更新代码模块的模块名称相同。
示意性的,通过reload(old_source)即可利用目标代码模块old_source对原有代码模块old_source进行更新,实现对更新后代码的编译载入。
相较于利用eval函数进行热加载热更新时,能够任意变更全局命名空间,影响原有项目中原有代码正常运行的问题(出现变量或方法重名),采用上述方法热加载热更新目标代码模块时,不会对全局命名空间造成污染,从而确保原有代码正常运行,并显著提高热加载热更新的成功率。
综上所述,本发明实施例中,采用Python原生的import机制导入用于热加载或热更新的目标代码模块,使得查找器能够根据该目标代码模块的模块名称,查找到相应的目标模块载入器,并交由目标模块载入器从对应的HTTP站点处下载相应的目标代码模块,从而将目标代码模块热加载或热更新得到程序中,完成热加载或热更新过程;整个热加载更新过程中,只需要利用import机制导入目标代码模块即可,无需额外调用其他相关函数;并且利用import自带的线程安全机制,避免了设置线程锁,极大的简化了远端加载的操作,提高了远端加载的效率。
在实际实施过程中,为了提高远端加载的速度和效率,开发人员预先设置多个HTTP站点分别存储不同类型的代码模块,并预先添加各个HTTP站点对应的模块载入器。远端加载过程中,查找器即从多个模块载入器中查找目标模块载入器,并进一步通过目标模块载入器从目标HTTP站点下载载入目标代码模块,下面采用示意性的实施例进行说明。
请参考图2,其示出了本发明一个实施例提供的代码加载更新方法的流程图,本实施例以该代码加载更新方法应用于服务器来举例说明,该方法包括:
步骤201,获取模块载入器添加指令,模块载入器添加指令用于指示添加模块载入器,模块载入器添加指令中包括HTTP站点的URL。
在项目开发维护过程中,开发人员预先设置至少一个HTTP站点,并将用于热加载或热更新的代码模块上传到HTTP站点中。为了使查找器知悉从哪些HTTP站点查找目标代码模块,需要预先将各个HTTP站点对应的模块载入器添加到系统中(即将HTTP站点添加到查找器的查找范围中)。
在一种可能的实施方式中,开发人员在项目程序中添加代码finder=HTTPMetaFinder(http://127.0.0.1:15000),指示将http://127.0.0.1:15000这一HTTP站点对应的模块载入器添加到系统中。
当需要向系统中添加多个模块载入器时(即添加多个HTTP站点时),开发人员通过写入类似的代码进行添加。
比如,开发人员通过代码finder 1=HTTPMetaFinder(http://127.0.0.1:15000)指示添加第一HTTP站点对应的第一模块载入器,通过代码finder2=HTTPMetaFinder(http://127.0.0.2:15000),指示添加第一HTTP站点对应的第二模块载入器。
步骤202,根据HTTP站点的URL添加模块载入器。
根据模块载入器添加指令中包含的HTTP站点的URL,服务器将用于从该HTTP站点下载代码模块的模块载入器添加到系统中。
在一种可能的实施方式中,开发人员通过代码sys.meta_path.append(finder),指示添加HTTP站点对应的模块载入器。
步骤203,获取导入的目标代码模块的模块名称,目标代码模块是用于热加载或热更新的代码模块,目标代码模块采用import机制导入。
本步骤的实施方式与上述步骤101相似,本实施例在此不再赘述。
步骤204,根据模块名称,检测目标代码模块是否存储在本地。
由于代码模块不仅可以存储在HTTP站点中(通常需要多服务器进行同步热加载更新时存储在HTTP站点),还可以存储在服务器本地,因此,为了确保准确获取目标代码模块,获取到模块名称后,进一步根据该模块名称检测目标代码模块是否存储在本地,若检测到目标代码模块存储在本地,则直接从本地载入目标代码模块,执行步骤205;若检测到目标代码模块未存储在本地,则通过下述步骤206至211从HTTP站点处下载目标代码模块。
步骤205,若目标代码模块存储在本地,则从本地载入目标代码模块。
步骤206,若目标代码模块未存储在本地,则获取各个模块载入器各自对应的模块命名特征,模块命名特征用于指示模块载入器对应的HTTP站点中存储的代码模块所符合的命名特征。
当仅存在一个HTTP站点时,由于代码模块均上传到该HTTP站点,因此服务器直接根据目标代码模块的模块名称从该HTTP站点处下载目标代码模块;而当存在至少两个HTTP站点,且各个HTTP站点存储的代码模块互不相同时,服务器首先需要确定目标代码模块所在的目标HTTP站点,然后利用模块载入器从该目标HTTP站点处下载目标代码模块。
当存在至少两个HTTP站点时,各个HTTP站点中存储的代码模块的模块名称符合各自的命名特征,相应的,各个模块载入器对应各自的模块命名特征,其中,该模块命名特征包括首字母特征、前缀特征和后缀特征中的至少一种。
在一种可能的实施方式中,开发人员预先设置2个HTTP站点,分别为HTTP站点A和HTTP站点B。服务器获取到模块载入器A(对应HTTP站点A)的模块命名特征为:HTTP站点A中存储的代码模块的模块名称的首字母均为a,获取到模块载入器B(对应HTTP站点B)的模块命名特征为:HTTP站点B中存储的代码模块的模块名称的首字母均为b。
在其他可能的实施方式中,当模块载入器对应的模块命名特征为前/后缀特征时,该模块载入器对应HTTP站点中各个代码模块的模块名称的前/后缀均相同。比如,同一HTTP站点中各个模块载入器的模块名称均采用new_xxx格式(前缀为new),或,同一HTTP站点中各个模块载入器的模块名称均采用xxx_new格式(后缀为new)。
需要说明的是,本实施例仅以上述三种模块命名特征为例进行示意性说明,并不对本发明构成限定。
可选的,为了确保代码模块被正确上传,各个HTTP站点还具备名称检测机制,当接收到上传的代码模块时,HTTP站点检测代码模块的模块名称是否符合自身的命名特征,若符合,则存储该代码模块,并向上传代码模块的终端反馈上传成功指示;若不符合,则删除该代码模块,并向上传代码模块的终端反馈上传失败指示。
步骤207,通过查找器查找模块名称符合的目标模块命名特征。
进一步的,查找器根据获取到的各个模块载入器的模块命名特征,查找与目标代码模块的模块名称符合的目标模块命名特征。
比如,当获取到模块名称为new_source,且模块载入器A对应的模块命名特征为首字母为a,模块载入器B对应的模块命名特征为首字母为b,模块载入器C对应的模块命名特征为前缀为new,模块载入器D对应的模块命名特征为后缀为new时,查找器即将模块载入器C对应的模块命名特征确定为目标模块命名特征。
步骤208,将目标模块命名特征对应的模块载入器确定为目标模块载入器。
通过上述步骤207确定出目标模块命名特征后,查找器进一步将目标模块命名特征对应的模块载入器确定为目标模块载入器,从而利用该目标模块载入器从相应的HTTP站点处下载目标代码模块。
在一种可能的实施方式中,查找器中定义的find_module方法如下:
def find_module(self,module_name,path=None):
return HttpModuleLoader(self._service_url)
其中,module_name为导入的目标代码模块的模块名称,path=None表示目标代码模块未存储在本地,self._service_url为目标模块载入器对应的HTTP站点的URL。
步骤209,通过目标模块载入器从对应的目标HTTP站点处下载目标代码模块。
为了确定出目标代码模块在目标HTTP站点的具体模块路径(即目标代码模块的存储路径),从而根据该模块路径下载目标代码模块,在一种可能的实施方式中,如图3所示,本步骤包括如下步骤。
步骤209A,获取目标HTTP站点的URL。
比如,目标模块载入器获取到目标HTTP站点的URL为:http://127.0.0.1:15000。
步骤209B,根据目标HTTP站点的URL和模块名称,拼接生成目标代码模块对应的模块路径。
进一步的,根据获取到的目标HTTP站点的URL以及目标代码模块的模块名称,目标模块载入器通过定义的get_filename方法对两者进行拼接,从而生成目标代码模块的模块路径。
在一种可能的实施方式中,目标模块载入器中定义的get_filename方法如下:
def get_filename(self,fullname):
file_name=self._baseurl+'/'+fullname+'.py'
return file_name
其中,file_name为目标代码模块的模块路径,self._baseurl为目标HTTP站点的URL,fullname为目标代码模块的模块名称,py为代码模块在HTTP站点中的存储格式(.py文件,即Python文件)。
比如,当目标HTTP站点的URL为http://127.0.0.1:15000,目标代码模块的模块名称为new_source时,拼接生成的模块路径为:http://127.0.0.1:15000/new_source.py。
步骤209C,根据该模块路径,通过目标模块载入器从目标HTTP站点处下载目标代码模块。
在一种可能的实施方式,基于拼接生成的模块路径,目标模块载入器通过定义的的load_get方法尝试从目标HTTP站点处下载目标代码模块,若下载到目标代码模块,则通过下述步骤210进行热更新或热加载,若未下载到目标代码模块(导入目标代码模块时,输入的模块名称有误),则输出下载失败指示。
步骤210,通过目标模块载入器将目标代码模块热加载或热更新得到程序中。
完成下载后,目标模块载入器进一步根据实际热加载或热更新需求将目标代码模块编译载入程序中。
本步骤的实施方式与上述步骤104相似,本实施在此不再赘述。
综上所述,本发明实施例中,采用Python原生的import机制导入用于热加载或热更新的目标代码模块,使得查找器能够根据该目标代码模块的模块名称,查找到相应的目标模块载入器,并交由目标模块载入器从对应的HTTP站点处下载相应的目标代码模块,从而将目标代码模块热加载或热更新得到程序中,完成热加载或热更新过程;整个热加载更新过程中,只需要利用import机制导入目标代码模块即可,无需额外调用其他相关函数;并且利用import自带的线程安全机制,避免了设置线程锁,极大的简化了远端加载的操作,提高了远端加载的效率。
本实施例中,获取到目标代码模块的模块名称后,检测目标代码模块是否存储在本地,并在目标代码模块存储在本地时,直接从本地载入目标代码模块,在目标代码模块未存储在本地时,通过查找器和模块载入器从远端HTTP站点处下载目标代码模块,确保本次加载和远端加载均能正常执行。
本实施例中,通过预先将代码模块存储在多个HTTP站点,并添加相应的模块载入器,使得后续进行远端加载时,只需要使用模块载入器从目标代码模块所处的HTTP站点处下载目标代码模块,而无需遍历所有代码模块,进而提高了远端加载的速度和效率。
在一个示意性的使用场景下,如图4所示,开发人员预先设置了26个用于存储代码模块的HTTP站点,分别为HTTP站点A至HTTP站点Z。其中,HTTP站点A中存储的代码模块符合的命名特征为:模块名称的首字母为a,HTTP站点B中存储的代码模块符合的命名特征为:模块名称的首字母为b,以此类推。同时,开发人员在项目程序中添加HTTP站点对应的模块载入器,分别为模块载入器A至模块载入器Z。
当需要向项目程序中热加载定制化代码,或,对项目程序中某一代码片段进行热更新时,开发人员即将编写的代码模块(以py文件的形式)上传至相应的HTTP站点。比如,开发人员将编写的aa.py(包含代码模块)上传至HTTP站点A。
当开发人员需要向项目程序中热加载模块名称为“ac”的代码模块时,即通过import ac导入目标代码模块。服务器获取到目标代码模块的模块名称“ac”后,通过查找器查找目标模块载入器。具体的,查找器根据模块名称以及各个模块载入器对应的模块命名特征,将模块载入器A(对应HTTP站点A,模块名称的首字母为a)确定为目标模块载入器。
进一步的,目标模块载入器根据HTTP站点A的URL“http://127.0.0.1:15000”以及模块名称“ac”,拼接生成目标代码模块的模块路径为“http://127.0.0.1:15000/ac.py”,从而根据该模块路径从HTTP站点A处下载目标代码模块,进而将目标代码模块编译载入到程序中。
整个过程中,开发人员只需要通过简单的import语句即可实现远端热加载及热更新,无需显示调用其他函数方法,提高热加载和热更新的速度。将上述代码加载更新方法应用到分布式系统中,能够减少分布式系统的整体更新次数,从而降低分布式系统的维护成本;并且,相较于利用eval函数进行热加载和热更新,使用Python原生的import机制进行热加载和热更新的成功率更高。
下述为本发明装置实施例,对于装置实施例中未详尽描述的细节,可以参考上述一一对应的方法实施例。
请参考图5,其示出了本发明一个实施例提供的代码加载更新装置的结构方框图。该代码加载更新装置通过硬件或者软硬件的结合实现成为服务器的全部或者一部分。该装置包括:
第一获取单元510,用于获取导入的目标代码模块的模块名称,所述目标代码模块是用于热加载或热更新的代码模块,所述目标代码模块采用import机制导入;
查找单元520,用于根据所述模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器,各个模块载入器对应各自的超文本传输协议HTTP站点,所述HTTP站点用于存储热加载或热更新的代码模块;
下载单元530,用于通过所述目标模块载入器从对应的目标HTTP站点处下载所述目标代码模块;
加载更新单元540,用于通过所述目标模块载入器将所述目标代码模块热加载或热更新得到程序中。
可选的,所述下载单元530,包括:
第一获取子单元,用于获取所述目标HTTP站点的统一资源定位符URL;
拼接子单元,用于根据所述目标HTTP站点的URL和所述模块名称,拼接生成所述目标代码模块对应的模块路径;
下载子单元,用于根据所述模块路径,通过所述目标模块载入器从所述目标HTTP站点处下载所述目标代码模块。
可选的,所述查找单元520,包括:
第二获取子单元,用于获取各个模块载入器各自对应的模块命名特征,所述模块命名特征用于指示模块载入器对应的HTTP站点中存储的代码模块所符合的命名特征;
查找子单元,用于通过所述查找器查找所述模块名称符合的目标模块命名特征;
确定子单元,用于将所述目标模块命名特征对应的模块载入器确定为所述目标模块载入器;
其中,所述模块命名特征包括首字母特征、前缀特征和后缀特征中的至少一种。
可选的,所述装置,还包括:
检测单元,用于根据所述模块名称,检测所述目标代码模块是否存储在本地;
载入单元,用于当所述目标代码模块存储在本地时,从本地载入所述目标代码模块;
所述查找单元,还用于当所述目标代码模块未存储在本地时,根据所述模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器。
可选的,所述装置,还包括:
第二获取单元,用于获取模块载入器添加指令,所述模块载入器添加指令用于指示添加模块载入器,所述模块载入器添加指令中包括HTTP站点的统一资源定位符URL;
添加单元,用于根据所述HTTP站点的URL添加模块载入器。
可选的,所述加载更新单元540,包括:
第一载入子单元,用于当对所述目标代码模块进行热加载时,通过所述目标模块载入器将所述目标代码模块的代码编译载入程序中;
第二载入子单元,用于当对所述目标代码模块进行热更新时,根据所述目标代码模块的代码,通过所述目标模块载入器对程序中的待更新代码模块进行代码更新,并将更新后的代码编译载入程序中,所述目标代码模块与所述待更新代码模块的模块名称相同。
综上所述,本发明实施例中,采用Python原生的import机制导入用于热加载或热更新的目标代码模块,使得查找器能够根据该目标代码模块的模块名称,查找到相应的目标模块载入器,并交由目标模块载入器从对应的HTTP站点处下载相应的目标代码模块,从而将目标代码模块热加载或热更新得到程序中,完成热加载或热更新过程;整个热加载更新过程中,只需要利用import机制导入目标代码模块即可,无需额外调用其他相关函数;并且利用import自带的线程安全机制,避免了设置线程锁,极大的简化了远端加载的操作,提高了远端加载的效率。
本实施例中,获取到目标代码模块的模块名称后,检测目标代码模块是否存储在本地,并在目标代码模块存储在本地时,直接从本地载入目标代码模块,在目标代码模块未存储在本地时,通过查找器和模块载入器从远端HTTP站点处下载目标代码模块,确保本次加载和远端加载均能正常执行。
本实施例中,通过预先将代码模块存储在多个HTTP站点,并添加相应的模块载入器,使得后续进行远端加载时,只需要使用模块载入器从目标代码模块所处的HTTP站点处下载目标代码模块,而无需遍历所有代码模块,进而提高了远端加载的速度和效率。
需要说明的是:上述实施例提供的代码加载更新装置,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将服务器的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的代码加载更新装置和代码加载更新方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
请参考图6,其示出了本发明一个实施例提供的服务器的结构方框图。
服务器600包括中央处理单元(CPU)901、包括随机存取存储器(RAM)602和只读存储器(ROM)603的系统存储器604,以及连接系统存储器604和中央处理单元601的系统总线605。所述服务器600还包括帮助计算机内的各个器件之间传输信息的基本输入/输出系统(I/O系统)606,和用于存储操作系统613、应用程序614和其他程序模块615的大容量存储设备607。
所述基本输入/输出系统606包括有用于显示信息的显示器608和用于用户输入信息的诸如鼠标、键盘之类的输入设备609。其中所述显示器608和输入设备609都通过连接到系统总线605的输入输出控制器610连接到中央处理单元601。所述基本输入/输出系统606还可以包括输入输出控制器610以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入输出控制器610还提供输出到显示屏、打印机或其他类型的输出设备。
所述大容量存储设备607通过连接到系统总线605的大容量存储控制器(未示出)连接到中央处理单元601。所述大容量存储设备607及其相关联的计算机可读介质为服务器600提供非易失性存储。也就是说,所述大容量存储设备607可以包括诸如硬盘或者CD-ROM驱动器之类的计算机可读介质(未示出)。
不失一般性,所述计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、EPROM、EEPROM、闪存或其他固态存储其技术,CD-ROM、DVD或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知所述计算机存储介质不局限于上述几种。上述的系统存储器604和大容量存储设备607可以统称为存储器。
根据本发明的各种实施例,所述服务器600还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即服务器600可以通过连接在所述系统总线605上的网络接口单元611连接到网络612,或者说,也可以使用网络接口单元611来连接到其他类型的网络或远程计算机系统(未示出)。
所述存储器还包括一个或者一个以上的程序,所述一个或者一个以上程序存储于存储器中,所述一个或者一个以上程序包含用于进行本发明实施例提供的代码加载更新方法的指令。上述指令由服务器中的处理器加载并执行,从而实现上述代码加载更新装置中各个功能模块或单元的功能。
在示例性实施例中,还提供了一种服务器。上述服务器备包括处理器和存储器,该存储器中存储有至少一条指令,该指令由处理器加载并执行以实现上述方法实施例示出的代码加载更新方法。
在示例性实施例中,还提供了一种计算机可读存储介质,该存储介质中存储有至少一条指令,该指令由处理器加载并执行以实现上述方法实施例示出的代码加载更新方法。例如,该计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种代码加载更新方法,其特征在于,所述方法包括:
获取导入的目标代码模块的模块名称,所述目标代码模块是用于热加载或热更新的代码模块,所述目标代码模块采用import机制导入;
获取各个模块载入器各自对应的模块命名特征,各个模块载入器对应各自的超文本传输协议HTTP站点,所述模块命名特征用于指示模块载入器对应的HTTP站点中存储的代码模块所符合的命名特征,所述HTTP站点用于存储热加载或热更新的代码模块,同一HTTP站点中存储的代码模块的模块名称符合相同的命名特征,所述HTTP站点在检测到上传的代码模块的模块名称符合自身的命名特征时对上传的代码模块进行存储;
通过查找器查找所述模块名称符合的目标模块命名特征;
将所述目标模块命名特征对应的模块载入器确定为目标模块载入器;
获取目标HTTP站点的统一资源定位符URL,所述目标HTTP站点是所述目标模块载入器对应的HTTP站点;
根据所述目标HTTP站点的URL和所述模块名称,拼接生成所述目标代码模块对应的模块路径;
根据所述模块路径,通过所述目标模块载入器从所述目标HTTP站点处下载所述目标代码模块;
通过所述目标模块载入器将所述目标代码模块热加载或热更新得到程序中。
2.根据权利要求1所述的方法,其特征在于,所述获取导入的目标代码模块的模块名称之后,还包括:
根据所述模块名称,检测所述目标代码模块是否存储在本地;
若所述目标代码模块存储在本地,则从本地载入所述目标代码模块;
若所述目标代码模块未存储在本地,则执行根据所述模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器的步骤。
3.根据权利要求1所述的方法,其特征在于,所述获取导入的目标代码模块的模块名称之前,还包括:
获取模块载入器添加指令,所述模块载入器添加指令用于指示添加模块载入器,所述模块载入器添加指令中包括HTTP站点的统一资源定位符URL;
根据所述HTTP站点的URL添加模块载入器。
4.根据权利要求1所述的方法,其特征在于,所述通过所述目标模块载入器将所述目标代码模块热加载或热更新得到程序中,包括:
当对所述目标代码模块进行热加载时,通过所述目标模块载入器将所述目标代码模块的代码编译载入程序中;
当对所述目标代码模块进行热更新时,根据所述目标代码模块的代码,通过所述目标模块载入器对程序中的待更新代码模块进行代码更新,并将更新后的代码编译载入程序中,所述目标代码模块与所述待更新代码模块的模块名称相同。
5.一种代码加载更新装置,其特征在于,所述装置包括:
第一获取单元,用于获取导入的目标代码模块的模块名称,所述目标代码模块是用于热加载或热更新的代码模块,所述目标代码模块采用import机制导入;
查找单元,用于获取各个模块载入器各自对应的模块命名特征,各个模块载入器对应各自的超文本传输协议HTTP站点,所述模块命名特征用于指示模块载入器对应的HTTP站点中存储的代码模块所符合的命名特征,所述HTTP站点用于存储热加载或热更新的代码模块,同一HTTP站点中存储的代码模块的模块名称符合相同的命名特征,所述HTTP站点在检测到上传的代码模块的模块名称符合自身的命名特征时对上传的代码模块进行存储;通过查找器查找所述模块名称符合的目标模块命名特征;将所述目标模块命名特征对应的模块载入器确定为目标模块载入器;
下载单元,用于获取目标HTTP站点的统一资源定位符URL,所述目标HTTP站点是所述目标模块载入器对应的HTTP站点;根据所述目标HTTP站点的URL和所述模块名称,拼接生成所述目标代码模块对应的模块路径;根据所述模块路径,通过所述目标模块载入器从所述目标HTTP站点处下载所述目标代码模块;
加载更新单元,用于通过所述目标模块载入器将所述目标代码模块热加载或热更新得到程序中。
6.根据权利要求5所述的装置,其特征在于,所述装置,还包括:
检测单元,用于根据所述模块名称,检测所述目标代码模块是否存储在本地;
载入单元,用于当所述目标代码模块存储在本地时,从本地载入所述目标代码模块;
所述查找单元,还用于当所述目标代码模块未存储在本地时,根据所述模块名称,通过查找器从至少一个模块载入器中查找到目标模块载入器。
7.根据权利要求5所述的装置,其特征在于,所述装置,还包括:
第二获取单元,用于获取模块载入器添加指令,所述模块载入器添加指令用于指示添加模块载入器,所述模块载入器添加指令中包括HTTP站点的统一资源定位符URL;
添加单元,用于根据所述HTTP站点的URL添加模块载入器。
8.根据权利要求5所述的装置,其特征在于,所述加载更新单元,包括:
第一载入子单元,用于当对所述目标代码模块进行热加载时,通过所述目标模块载入器将所述目标代码模块的代码编译载入程序中;
第二载入子单元,用于当对所述目标代码模块进行热更新时,根据所述目标代码模块的代码,通过所述目标模块载入器对程序中的待更新代码模块进行代码更新,并将更新后的代码编译载入程序中,所述目标代码模块与所述待更新代码模块的模块名称相同。
9.一种服务器,其特征在于,所述服务器包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由所述处理器加载并执行以实现如权利要求1至4任一所述的代码加载更新方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由处理器加载并执行以实现如权利要求1至4任一所述的代码加载更新方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710446714.9A CN109086059B (zh) | 2017-06-14 | 2017-06-14 | 代码加载更新方法、装置及服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710446714.9A CN109086059B (zh) | 2017-06-14 | 2017-06-14 | 代码加载更新方法、装置及服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109086059A CN109086059A (zh) | 2018-12-25 |
CN109086059B true CN109086059B (zh) | 2023-05-09 |
Family
ID=64839263
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710446714.9A Active CN109086059B (zh) | 2017-06-14 | 2017-06-14 | 代码加载更新方法、装置及服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109086059B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110333892B (zh) * | 2019-06-28 | 2022-12-13 | 百度在线网络技术(北京)有限公司 | 应用程序的补丁的生成方法、装置、设备和存储介质 |
CN110837391B (zh) * | 2019-11-04 | 2021-02-12 | 广州方硅信息技术有限公司 | 应用程序的热更新方法及装置、存储介质及电子设备 |
CN118349218A (zh) * | 2024-04-09 | 2024-07-16 | 丰贺信息科技(上海)有限公司 | Python代码热重载方法、系统及介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104216700A (zh) * | 2013-09-10 | 2014-12-17 | 侯金涛 | 基于云计算的html5应用的打包、安装、卸载、运行方法及系统 |
CN106294113A (zh) * | 2015-06-03 | 2017-01-04 | 阿里巴巴集团控股有限公司 | 一种基于可编程式测试服务的创建方法及装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9639375B2 (en) * | 2008-08-28 | 2017-05-02 | Red Hat, Inc. | Generation of language bindings for libraries using data from compiler generated debug information |
CN103984582B (zh) * | 2014-06-04 | 2017-05-31 | 网易(杭州)网络有限公司 | 一种热更新方法和装置 |
CN105487885B (zh) * | 2015-11-23 | 2018-10-19 | 盛趣信息技术(上海)有限公司 | 手游热更新方法 |
CN105677415B (zh) * | 2016-01-06 | 2020-07-17 | 网易(杭州)网络有限公司 | 热更新方法及装置 |
CN106598841B (zh) * | 2016-11-07 | 2020-05-01 | 上海斐讯数据通信技术有限公司 | 一种自动化测试框架的自安装方法及系统 |
-
2017
- 2017-06-14 CN CN201710446714.9A patent/CN109086059B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104216700A (zh) * | 2013-09-10 | 2014-12-17 | 侯金涛 | 基于云计算的html5应用的打包、安装、卸载、运行方法及系统 |
CN106294113A (zh) * | 2015-06-03 | 2017-01-04 | 阿里巴巴集团控股有限公司 | 一种基于可编程式测试服务的创建方法及装置 |
Non-Patent Citations (1)
Title |
---|
基于VB的冰箱测试系统设计与实现;丛迎九;《中国优秀博硕士学位论文全文数据库 (硕士)信息科技辑》;I138-181 * |
Also Published As
Publication number | Publication date |
---|---|
CN109086059A (zh) | 2018-12-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101571809B (zh) | 一种插件注册的实现方法及其装置 | |
CN110673923B (zh) | Xwiki系统配置方法、系统及计算机设备 | |
CN104731589A (zh) | 用户界面的自动生成方法及自动生成装置 | |
CN106325847B (zh) | 基于iOS平台获取应用程序功能的方法和装置 | |
CN110968331B (zh) | 应用程序运行的方法和装置 | |
CN106294113B (zh) | 一种基于可编程式测试服务的创建方法及装置 | |
CN109086059B (zh) | 代码加载更新方法、装置及服务器 | |
CN110365724B (zh) | 任务处理方法、装置及电子设备 | |
CN110874236A (zh) | 一种跨平台应用装置、终端及存储介质 | |
CN106371874A (zh) | 一种插件数据加载方法及设备 | |
CN112769706B (zh) | 组件化路由方法及系统 | |
CN112395253B (zh) | 索引文件生成方法、终端设备、电子设备及介质 | |
CN110231956B (zh) | 应用程序版本构建的方法、系统及装置 | |
US20130054760A1 (en) | Data upload method using shortcut | |
CN110968302A (zh) | 前端开发方法、装置及电子设备 | |
US9411618B2 (en) | Metadata-based class loading using a content repository | |
CN110716786A (zh) | 一种页面展示方法、系统及存储介质 | |
CN107239303B (zh) | 应用程序更新包生成及应用程序更新的方法、装置 | |
CN112732265B (zh) | 一种数据处理方法和相关装置 | |
CN109375946B (zh) | 一种管理节点包管理器的组件包的方法及系统 | |
CN113360156A (zh) | 一种ios编译方法及相关设备 | |
CN112925561B (zh) | 一种软件开发方法、装置、计算机设备及存储介质 | |
CN111581578B (zh) | 接口请求处理方法和装置 | |
CN109635175B (zh) | 页面数据拼接方法、装置、可读存储介质和电子设备 | |
CN112905164A (zh) | 一种项目代码处理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |