`
qiezi
  • 浏览: 497215 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

asgard项目遗留问题 (2005-09-27更新)

    博客分类:
  • c++
阅读更多
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库 | asgard-api-plugin-metrics-mesos-0.3.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:asgard-api-plugin-metrics-mesos-0.3.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    asgard-api:Asgard项目的API

    Asgard API 测试覆盖率 Typehint覆盖范围 阿斯加德项目Asgard项目的存在主要有两个目的: 便利开发应用程序(所有类型)的人们的生活; 对于维护运行数百/数千个应用程序的基础结构的人员来说,生活变得更轻松通过...

    Asgard Test and Monitoring Tool-开源

    此外,Asgard可能支持持续集成(CI)和持续部署(CD),这意味着它可以与版本控制系统集成,每当代码更新时自动运行测试,确保每次提交的质量。 在监控方面,Asgard提供了实时性能指标和报警功能。它能监控服务器...

    Asgard Free Software RPG-开源

    文件"asgard-0.3.10"很可能代表了Asgard游戏的一个版本,版本号0.3.10可能意味着这是项目的早期阶段,但已经包含了基本的游戏功能和一些改进。用户可以通过下载这个压缩包来体验游戏,同时也鼓励有能力的社区成员...

    asgard-api-sdk:用于编写Asgard API插件的SDK

    Asgard API SDK 在这个项目中,我们找到可以在为API编写的插件中使用的通用代码。可用功能asgard.sdk.options.get_option() 它允许读取多个环境变量并在列表中返回值,例如: 数据= get_option(“表格”,“地址...

    choerodon-front-asgard

    choerodon-front-asgard Choerodon Front Asgard 是一个任务调度服务(通过saga 实现微服务之间的数据一致性)前端。 Start cd choerodon-front-asgard npm install chmod -R u+x node_modules npm start 更新日志 ...

    Asgard Integration Test Tool-开源

    Asgard Integration Test Tool是一款专为开发者设计的开源集成测试工具,它的主要目的是为了简化和自动化在软件开发过程中对各种组件交互的测试。这个工具能够模拟多种系统接口,包括JDBC(Java Database ...

    基于Java的choerodon-asgard任务调度服务设计源码

    本项目是基于Java开发的choerodon-asgard任务调度服务,包含182个文件,其中包括132个Java源代码文件、11个Groovy脚本文件、10个XML配置文件、9个YAML配置文件、4个Markdown文档文件、3个YML配置文件、3个SQL文件、2...

    Asgard 原始文件

    NEXON公司的韩国服务器的原始.EXE文件,用于未备份而修改exe文件后备用

    matlab如何敲代码-asgard:阿斯加德

    matlab如何敲代码ASGarD-自适应稀疏网格离散化 要在您的工作中引用ASGarD代码,请使用:(TODO) ASGarD项目的目标是构建专门针对高维PDE的求解器,在该求解器中,“维数诅咒”先前已排除了有用的连续谱/ Eularian...

    Asgard-开源

    Asgard是一个简单的项目经理,使用您喜欢的编辑器(作者使用Scite)。

    Asgard-DNA:个人服务器堆栈

    cd Asgard-DNA 重命名一些文件并根据自己的喜好进行编辑-这两个文件都说明了应在何处使用哪些值: cp htpc/.defaults-env htpc/.env && \ cp traefik/data/default_traefik.yml traefik/data/traefik.yml 为了在...

    immutable-infrastructure-for-bootstrappers:使用Asgard,Packer,Vagrant,VirtualBox和AWS的不可变基础架构的虚拟机配置

    引导者的不可变基础架构该项目提供了一个虚拟机框架,以使用以下各项在Amazon Web Services中促进低成本的不可变基础架构: - 创建系统快照,能够输出多种格式,包括亚马逊机器映像和虚拟箱箱(对我来说很有用)的...

    吉他谱_Herald of Darkness - Old Gods Of Asgard.pdf

    初级入门吉他谱 guitar tab

    Resources:THORChain项目的资源; 白皮书,品牌,字体,徽标,文档

    资源文件资料该项目的白皮书。 项目审核。品牌推广THORChain品牌推广将在THORChain资产中使用。 请参阅《 主要: 中学:徽标商标白色的黑色的长 图标 颜色调色板十六进制名称调色板十六进制名称 #282c34 夜黑(900...

    CRISPR_Asgard

    每个目录都包含一个.ipynb脚本,该脚本为项目的每个阶段执行代码。 arCOG:CRISPR_arCOGs.ipynb脚本消除了未注释为CRISPR相关的arCOG,仅保留了CRISPR相关的arCOG。 CRISPR arCOG配置文件位于ali-ar14 /目录下。 ...

    google-api-services-doubleclicksearch-v2-rev18-1.14.2-beta.zip

    开源项目通常拥有活跃的社区支持,开发者可以通过参与贡献代码、提交问题或讨论来改进项目。 在压缩包的子文件名"frigga-master"中,我们可以推测这包含了Frigga项目的主分支源代码。"master"分支通常是GitHub等...

    ASGARD:从DNA或蛋白质序列进行代谢重建。-开源

    在实际应用中,ASGARD可以帮助科研人员在多个层面上探索生命科学问题。例如,通过代谢途径重建,可以研究病原体的生存策略,或者优化工业微生物的代谢途径以提高生产效率。同时,对于基因功能的注释,ASGARD可以加速...

    asgard-exchange

    该项目是使用生成的。 对于组件样式,我们使用和 。 开发服务器 使用ETHERSCAN_KEY和INFURA_PROJECT_ID创建一个.env文件。 为本地开发人员运行npm run start 。 这将建立src/environments文件夹并启动本地服务器。 ...

    Asgard:阿斯加德框架

    Asgard简介Asgard是设计用于综合解决常驻进程应用、计划任务、定时任务的分布式作业管理系统。架构设计Asgard系统由web节点、master节点、agent节点组成。web节点主要功能包括实例管理、分组管理、作业配置、作业...

Global site tag (gtag.js) - Google Analytics