`
qiezi
  • 浏览: 491440 次
  • 性别: 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是用于测试和监视许多元素和集成序列的工具

    Asgard Free Software RPG-开源

    Asgard是一款角色扮演游戏,包含菜单,随机战斗,地图,城镇和地牢。 加入开发人员,作家和艺术家社区。 我们的目标是为世界各地的游戏玩家提供丰富而美丽的免费软件RPG。

    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 原始文件

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

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

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

    Asgard Integration Test Tool-开源

    Asgard是一个集成测试工具,用于模拟JDBC,文件系统,SAP和LDAP交互。

    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中促进低成本的不可变基础架构: - 创建系统快照,能够输出多种格式,包括亚马逊机器映像和虚拟箱箱(对我来说很有用)的...

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

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

    CRISPR_Asgard

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

    asgard-exchange

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

    Asgard:阿斯加德框架

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

    Asgard:使用PyQt5开发的Thor的GUI

    :不仅与该项目有关,而且与自我开始编程以来所遇到的所有问题的所有答案都有关。 ( 从 ):我从你几乎所有的东西我知道Python的经验教训。 感谢您提供详细的教程和示例! :感谢您提供! 按照您的步骤在不到一个...

    AsgardCMSPrivateMessage:Asgard CMS的私人消息模块

    该模块在您出色的Asgard CMS上添加了私人消息功能! 因此,您获得了以下功能: 注册用户之间的私人消息 支持消息(即使是客人也可以) 一些额外的设置 安装 按照的,模块名称为“ grummfy / acms-privatemessage...

    Asgard

    自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) ...

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

    ASGARD是用于代谢途径重建的软件,但它也可以生成其他类型的生物序列注释(EC和GO编号,BLAST报告)。 该程序旨在在类似UNIX的系统中运行,并支持SGE或PBS。

Global site tag (gtag.js) - Google Analytics