asgard项目已经准备了一段时间了,不过有些基本问题还需要考虑,也有一些是新发现的问题,以及自认为比较好的解决办法。
通过第2、第4条的仔细研究,已经渐渐完善、明确了动态部分和静态部分的关系,使得Method包装类所完成的功能渐渐接近于一个函数,而元信息则脱离具体的对象提升到全局(当然还有些小问题没有解决)。
1、参数名称的问题。为了与SOAP等基于XML的协议兼容,必须开始就把参数名称考虑在内。
代码经过C++编译器编译以后,类型、变量名称等都不复存在,唯一留下的是RTTI,显然不能解决这个问题。所以只能在定义时把它加入。
BEGIN_SERVICE(TestService)
METHOD (void(in<int>, inout<string>, out<short>), method1, index, info, result);
END_SERVICE()
如果使用这种方式,index, info, result分别表示变量名字,在宏里面转成字符串,看起来好像不太舒服,而且宏不支持参数个数变化。
BEGIN_SERVICE(TestService)
METHOD (void(in<int>, inout<string>, out<short>), method1, "(index, info, result)");
METHOD (int(in<int>, inout<string>), method2, "result(index, info)");
END_SERVICE()
这种可能稍稍舒服一点,在Method构造函数或其它地方解析这个字符串,赋给各个参数。不过它的缺点是把编译期应该检查出来的错误,延迟到运行期。如果在编译期来做,又会使接口描述变得很复杂。
只是为了得到参数的名字,就要增加这么些麻烦。
c++0x只是一个库的标准,估计XTI也不会加入这些特性,而且c++0x很遥远,所以暂时以这种方式来做。
暂时的解决办法:
BEGIN_SERVICE(TestService)
METHOD (void(in<int>, inout<string>, out<short>), method1);
METHOD (int(in<int>, inout<string>), method2);
BEGIN_SERVICE_DEFINE(TestService)
METHOD_DEFINE (method1, "(index, info, result)", test_func);
METHOD_DEFINE (method2, "result(index, info)", &Test::test_method);
END_SERVICE_DEFINE()
END_SERVICE()
缺点是参数名称中的错误,要延迟到运行期才能解决掉。
2、服务对象的大小。
如果客户端要调用其中一个方法,生成一个TestService,则构造成本太高,特别是一个服务中有多个方法的时候。一个服务容纳了多个方法,而每个方法包含一个vector,以及各个参数,这还没考虑以后的扩展。
所以应该修改调用方式,让它只只需要生成调用所需的最小(少)对象。
这部分考虑还不成熟,暂时可以不管它,而以方法作为考虑的对象。
暂时想到的解决办法:Method对象中的parameters容器和各个参数,只在调用operator ()或async_call时,才真正生成出来。
这样的话,Method对象中仅保存一个空的vector。
甚至这个vector也可以只是一个空指针,当调用那几个函数时,才生成一个。
暂时把这个过程命名为Create On Call(COC)。
COC的好处是显而易见的,每个对象将只有8字节,虚表指针+数据对象的指针,“数据对象”是实际调用时才生成的对象,包括参数vector容器、回调函数指针(可能由动态生成一个委托对象,以适应广泛类型的回调函数)、对象锁(防止干扰到前一个调用)。初始化成本接近0(虚函数表的初始化忽略不计)。
当调用operator()或async_call时(以下简称CALL),将调用create_parameters虚函数,动态生成一个vector。这样,没有调用到的Method不会象原来一样影响到服务对象的构建性能。
这就要求把Method的“元”信息提到全局,当然更符合“元”的本意,原来由服务对象查询Method以获得“元”信息的过程,现在看来也是不合理的。
3、in模板可以省略。in是默认的参数类型,返回值则默认为out类型,这都是不需要明确指定的。
解决办法:
这个问题是比较好解决的,在InOutTypeTraits模板类中,为各个偏特化版本定义一个type类型,InOutTypeTraits<T>::type的类型为in<T>,InOutTypes<in<T>>::type的类型为in<T>,InOutTypes<inout<T>>::type的类型为inout<T>,InOutTypes<out<T>>::type的类型为out<T>,InList模板类中进行这种转换。
4、异步调用队列。在第2点中介绍道:
每个对象将只有8字节,虚表指针+数据对象的指针,“数据对象”是实际调用时才生成的对象,包括参数vector容器、回调函数指针(可能由动态生成一个委托对象,以适应广泛类型的回调函数)、对象锁(防止干扰到前一个调用)。初始化成本接近0(虚函数表的初始化忽略不计)。
提到了对象锁,这是一种低效的做法,可以使用异步调用队列来替代它。
解决办法:当开始一个调用时,临时生成上面所说的“数据对象”,交由一个调用队列去完成。这时,由于Method对象基本不管理数据,所以它成了一个空壳,作用是保存类型信息。
异步调用最好的实现就是整个系统都由异步调用构成,而同步调用是由异步调用模拟而成。原本打算绕过这种方式,用最简单的方法来做,现在好像又绕回来了。
上面这个做法,很好地把元信息和真实数据分开了,所以打算改成这种结构。
5、全局元信息。
通过第4条的研究,已经使得Method对象成为一个空壳,而“数据对象”在没有调用时又不生成,使得自省结构必须重新做。
考察了java等语言的自省,也打算把元信息的位置提升到全局,而每个Method对象将只保留一个全局元信息的指针,这样应该更自然。
(以后遇到的问题只更新到这个文档中)
相关推荐
资源分类:Python库 所属语言:Python 资源全名:asgard-api-plugin-metrics-mesos-0.3.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Asgard API 测试覆盖率 Typehint覆盖范围 阿斯加德项目Asgard项目的存在主要有两个目的: 便利开发应用程序(所有类型)的人们的生活; 对于维护运行数百/数千个应用程序的基础结构的人员来说,生活变得更轻松通过...
Asgard是用于测试和监视许多元素和集成序列的工具
Asgard是一款角色扮演游戏,包含菜单,随机战斗,地图,城镇和地牢。 加入开发人员,作家和艺术家社区。 我们的目标是为世界各地的游戏玩家提供丰富而美丽的免费软件RPG。
Asgard API SDK 在这个项目中,我们找到可以在为API编写的插件中使用的通用代码。可用功能asgard.sdk.options.get_option() 它允许读取多个环境变量并在列表中返回值,例如: 数据= get_option(“表格”,“地址...
choerodon-front-asgard Choerodon Front Asgard 是一个任务调度服务(通过saga 实现微服务之间的数据一致性)前端。 Start cd choerodon-front-asgard npm install chmod -R u+x node_modules npm start 更新日志 ...
NEXON公司的韩国服务器的原始.EXE文件,用于未备份而修改exe文件后备用
matlab如何敲代码ASGarD-自适应稀疏网格离散化 要在您的工作中引用ASGarD代码,请使用:(TODO) ASGarD项目的目标是构建专门针对高维PDE的求解器,在该求解器中,“维数诅咒”先前已排除了有用的连续谱/ Eularian...
Asgard是一个集成测试工具,用于模拟JDBC,文件系统,SAP和LDAP交互。
Asgard是一个简单的项目经理,使用您喜欢的编辑器(作者使用Scite)。
cd Asgard-DNA 重命名一些文件并根据自己的喜好进行编辑-这两个文件都说明了应在何处使用哪些值: cp htpc/.defaults-env htpc/.env && \ cp traefik/data/default_traefik.yml traefik/data/traefik.yml 为了在...
引导者的不可变基础架构该项目提供了一个虚拟机框架,以使用以下各项在Amazon Web Services中促进低成本的不可变基础架构: - 创建系统快照,能够输出多种格式,包括亚马逊机器映像和虚拟箱箱(对我来说很有用)的...
资源文件资料该项目的白皮书。 项目审核。品牌推广THORChain品牌推广将在THORChain资产中使用。 请参阅《 主要: 中学:徽标商标白色的黑色的长 图标 颜色调色板十六进制名称调色板十六进制名称 #282c34 夜黑(900...
每个目录都包含一个.ipynb脚本,该脚本为项目的每个阶段执行代码。 arCOG:CRISPR_arCOGs.ipynb脚本消除了未注释为CRISPR相关的arCOG,仅保留了CRISPR相关的arCOG。 CRISPR arCOG配置文件位于ali-ar14 /目录下。 ...
该项目是使用生成的。 对于组件样式,我们使用和 。 开发服务器 使用ETHERSCAN_KEY和INFURA_PROJECT_ID创建一个.env文件。 为本地开发人员运行npm run start 。 这将建立src/environments文件夹并启动本地服务器。 ...
Asgard简介Asgard是设计用于综合解决常驻进程应用、计划任务、定时任务的分布式作业管理系统。架构设计Asgard系统由web节点、master节点、agent节点组成。web节点主要功能包括实例管理、分组管理、作业配置、作业...
:不仅与该项目有关,而且与自我开始编程以来所遇到的所有问题的所有答案都有关。 ( 从 ):我从你几乎所有的东西我知道Python的经验教训。 感谢您提供详细的教程和示例! :感谢您提供! 按照您的步骤在不到一个...
该模块在您出色的Asgard CMS上添加了私人消息功能! 因此,您获得了以下功能: 注册用户之间的私人消息 支持消息(即使是客人也可以) 一些额外的设置 安装 按照的,模块名称为“ grummfy / acms-privatemessage...
自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) ...
ASGARD是用于代谢途径重建的软件,但它也可以生成其他类型的生物序列注释(EC和GO编号,BLAST报告)。 该程序旨在在类似UNIX的系统中运行,并支持SGE或PBS。