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

项目快完成了

阅读更多
原打算分布式平台先使用异步编程方式来完成的,轻量级线程的实现以后再做个协议兼容的改造,后来发现现有项目的同步逻辑的代码要改成异步回调方式,改的东西太多,所以最近几星期把轻量级线程方式先实现了。测试结果还算理想,ucontext的切换效率在超过200万/秒,erlang在我测试的相同机器上非smp版本720万/秒,smp版本不到200万/秒,切换性能的确有差距,不过目前看来是足够用了。还没有去实现Lock-free的SMP版本,目前用的是线程池来跑多线程逻辑,需要多线程跑的部分只需要主动把当前轻量级线程切到线程池中,运行完那部分再切回来就可以了。IO部分把aio和event系统结合起来了,所以虽然是在单线程程序中执行,但文件读写部分并不是阻塞的。

使用erlang会有不少阻力,虽然过去曾经宣传过不少,项目组基本上也都知道这个东西,但用它做项目特别是改造现有项目,工作量还是大了些。用C++实现的分布式平台对现有代码兼容较好,对轻量级线程不友好的逻辑(占用栈过大,有阻塞等),可以简单地加一个线程池切换,和Eurasia的做法相似。

目前完成了actor模型(轻量级线程、send/receive及超时语义,进程注册等),socket模块,分布式模型(和erlang的node相似),aio整合,Future(参见IoLanguage,好玩的东东),由于使用C++开发,不用忍受Erlang的FP语法,还可以使用C++的语法特性。原以为这个平台做完以后现有代码修改较多,目前看来仅有少量修改即可,代码编写比异步回调方式容易多了。
分享到:
评论
7 楼 qiezi 2009-03-03  
hurd 写道

GetValue()时挂起轻量级线程是不是没用到信号量?能介绍下怎么实现的吗?

因为是轻量级线程,运行在同一个本地线程里,不需要用信号量。

调用者调用GetValue()时如果实际的操作已经返回,那么直接返回结果;如果没有返回,就把自己加到Future对象的等待队列里,并挂起;
执行的线程完成后,会把等待队列里的线程都唤醒,它们醒来后直接返回结果就行了。

这里的挂起就是交出执行权,并且不把自己放到调度器里。唤醒就是把该线程放到调度器的队列里。
6 楼 hurd 2009-03-03  
GetValue()时挂起轻量级线程是不是没用到信号量?能介绍下怎么实现的吗?
5 楼 inshua 2009-03-03  
qiezi 写道

上面调用GetValue()时,如果调用还没有返回,就会“挂起”当前轻量级线程,直到取得结果。IoLanguage那里学来的。


java 也有这种 future 的 feature
4 楼 qiezi 2009-03-02  
Future类功能是这样的,拿前面的CacheService为例,一次网络请求总会消耗时间的,如果并发发出2次请求,很可能只会用到一次的时间(考虑并行的map),客户端写这种代码不是很方便,可以用Future来实现。

假设已经实现了一个CacheClient:
class Cache
{
public:
  int Query(const std::string key, std::string& value);
};


假定它内部使用前面的Send/Receive来实现。Future是这么用的:
Cache cache;
std::string value1;
std::string value2;
Future<int(const std::string&, std::string&)> future1(&Cache::Query, cache, "key1", value1);
Future<int(const std::string&, std::string&)> future2(&Cache::Query, cache, "key2", value2);
std::cout << "result1: " << future1.GetValue() << ", value1: " << value1 << std::endl;
std::cout << "result2: " << future2.GetValue() << ", value2: " << value2 << std::endl;

上面调用GetValue()时,如果调用还没有返回,就会“挂起”当前轻量级线程,直到取得结果。IoLanguage那里学来的。
3 楼 qiezi 2009-03-02  
呵呵,这么快就看到啦。

语法还是c++的,融入了一些erlang的语法特点:
// 消息类
// 手写或idl自动生成元信息、序列化代码,可以分布式发送,否则只能在进程内发送
class QueryMessage : public Message
{
  std::string key;
};

class QueryResultMessage : public Message
{
  int result;
  std::string value;
};



// Cache服务
void CacheService(Pid pid) {
  typedef std::map<std::string, std::string> Cache;
  Cache cache;
  while(true) {
    Message* m = Receive();
    ON_EXIT_BLOCK(&Delete<Message>, m);
    QueryMessage* queryMessage = dynamic_cast<QueryMessage*>(m);
    if (!m) {
      printf("unknown message: %s", m->GetTypeName().c_str());
      continue;
    }
    QueryResultMessage* resultMessage = new QueryResultMessage;
    Cache::const_iterator iter = cache.find(queryMessage->key);
    if (iter == cache.end()) {
      resultMessage->result = -1;
    }
    else {
      resultMessage->result = 0;
      resultMessage->value = iter->second;
    }
    Send(resultMessage);
  }
}

void co_main()
{
  REGISTER("CacheService", Self());
  CacheService();
}


// Cache客户端
void CacheClient()
{
  while(true) {
    Sleep(500); // sleep 0.5 second
    QueryMessage* queryMessage = new QueryMessage;
    queryMessage->key = "hello";
    // 请求分布式服务
    Send("CacheService", "127.0.0.1:9999", queryMessage);
    Message* m = Receive(3000); // wait 3 seconds
    ON_BLOCK_EXIT(&Delete<Message>, m);
    QueryResultMessage* resultMessage = dynamic_cast<QueryResultMessage*>(m);
    if (!resultMessage) {
      printf("receive fail");
      continue;
    }
    printf("query result: %d, value: %s", resultMessage->result, resultMessage->value.c_str());
  }
}

void co_main()
{
  // 11 clients
  for (int i=0; i<10; i++) {
    SPAWN(&CacheClient);
  }
  CacheClient();
}
2 楼 dogstar 2009-03-01  
就说qiezi最近怎么不见发blog了呢。原来在闭关修炼中 :)
1 楼 inshua 2009-03-01  
  秀一段 sample 性的代碼看看? 比如 1 + 1 + 2

相关推荐

    MIT开源协议,多端适用的租房小程序,带完整的管理员后台

    在项目快完成的时候,介绍的那个人跑路了,所以就没有后续了,想着与其直接删除还不如开源分享给大家一起讨论学习。 这个项目的经历也让作者明白了一些事情,就是如果别人委托自己帮做项目的时候,不管项目的规

    租房小程序,uniapp+若依,易于维护和扩展

    在项目快完成的时候,介绍的那个人跑路了,所以就没有后续了,想着与其直接删除还不如开源分享给大家一起讨论学习。 这个项目的经历也让我明白了一些事情,就是如果别人委托自己帮做项目的时候,不管项目的规模如何...

    计算题讲解2

    1. **案例一**:基于给定的活动历时表,我们需要找出关键路径以确定项目的最快完成时间,并考虑采取何种措施来进一步缩短项目工期。 - **解答**:根据网络图绘制及关键路径分析,本项目的最快完成时间为12周。为了...

    编译利器之大型项目如何使用Automake和Autoconf完成编译配置分享.pdf

    本文将详细介绍如何使用Automake和Autoconf来完成大型项目的编译配置。 Automake和Autoconf是GNU开源项目中的两个主要工具,用于帮助开发者快速生成Makefile文件,从而简化编译过程。 标题:编译利器之大型项目如何...

    项目管理-项目需求变更申请单

    变更请求分析、影响分析、考虑的解决方案、工作量估算、可能的开始实施日期、可能的期望完成日期、影响程度等,这些信息能够帮助项目团队对变更请求进行深入的分析和评估,确定变更请求的可行性和必要性。...

    实践项目部署文档,标准样例(使用ant 5分钟完成web项目部署)

    项目部署文档标准样例(使用Ant 5分钟完成Web项目部署) 本文档旨在提供一个标准的项目部署文档,使用Ant工具,可以在5分钟内完成Web项目的部署。整个部署过程分为四大步骤:系统要求、软件环境、部署步骤和数据源...

    项目建设工作汇报总结PPT模板.pptx

    * 完成进度的重要性:完成进度是项目建设工作汇报的重要组成部分,能够帮助项目经理和团队成员了解项目的完成情况、存在的问题和解决方案等信息。 * PPT模板的作用:PPT模板能够帮助项目经理和团队成员快速生成高...

    社会组织项目管理制度.pdf

    - 义务:合理使用资源,控制项目进程,处理内外关系,督导培训项目社工,确保项目按时完成。 6. **项目社工职责**: - 任期:从项目立项到完成验收。 - 职责:配合项目负责人,监督项目实施,提出优化建议,解决...

    项目管理范例表包含项目状态表等

    项目进度状态表是一个详尽的记录,展示了项目各个阶段、任务和活动的完成情况。它通常包括以下关键元素: 1. **任务列表**:列出项目的所有任务,每个任务都有唯一的标识符,便于跟踪。 2. **任务描述**:简述每个...

    Excel模板技改项目完成投资财务清单.zip

    在Excel模板技改项目完成投资财务清单中,我们可以深入探讨几个关键的知识点,这些知识点对于理解和管理企业项目投资至关重要。首先,"技改项目"通常指的是技术改造项目,旨在通过改进现有设备、工艺或系统来提升...

    项目管理过程中的项目汇报 项目周报 项目月报

    在项目管理中,有效的沟通是确保项目成功的...通过制定和遵循一套有效的项目汇报流程,可以提高项目管理的效率,确保项目按照预定的时间表和预算顺利完成,同时减少沟通障碍,增强团队合作,最终提升项目成功的可能性。

    上海交通大学IT项目管理IT项目管理IT项目管理

    首先,IT项目管理的目标是确保项目能够按时、按预算、按质量地完成,同时满足业务需求和用户期望。这需要项目经理具备良好的技术理解能力、沟通协调技巧以及风险管理策略。 在项目启动阶段,项目经理需要明确项目的...

    软件项目管理模板 软件项目

    通过遵循这些模板,项目团队可以更好地预测和控制项目风险,确保项目按时、按预算、按质量完成。此外,模板还能帮助新加入团队的成员快速适应项目,促进团队协作。 在实际操作中,项目经理可以根据具体项目需求调整...

    项目验收ppt目录.pptx

    项目验收是项目管理过程中的一个重要环节,它标志着项目的完成和交付。一份详尽的项目验收PPT目录可以帮助评审人员全面了解项目的执行情况,从而做出是否通过验收的决定。以下是根据提供的内容,对项目验收PPT目录的...

    医药继续教育项目完成情况报告表.doc

    总之,医药继续教育项目完成情况报告表是一个全面反映项目执行过程和效果的重要工具,通过对其中各项指标的细致分析,不仅可以为项目的成功实施提供有力支撑,还能为后续类似项目的策划与执行积累宝贵经验。

    环保行业重大事件快评:PPP项目库清理完成,环保行业受影响有限.pdf

    环保行业重大事件快评:PPP项目库清理完成,环保行业受影响有限.pdf

    软件项目管理文档软件项目管理文档

    3. 项目范围说明书:详细定义项目将完成的工作,包括功能需求、非功能需求等。 4. WBS(工作分解结构):将项目任务分解成可管理的小单元,便于分配责任和跟踪进度。 5. 甘特图:通过图形化方式展示项目计划,包括...

    实验一-采用Microsoft-Project-完成项目管理6.pdf

    项目开发组决定运用Microsoft Project软件高效地管理项目开发过程,该OA产品要求从2013年3月11日起建设,并在2013年7月1日之前正式上线,并且工作越快开展越好。 项目管理过程 项目管理过程可以分为五个阶段:策划...

    Unity恐龙快跑游戏项目

    《Unity恐龙快跑游戏项目详解》 Unity,作为全球最流行的跨平台游戏开发引擎之一,以其强大的3D和2D渲染能力、丰富的内置资源库以及易学易用的C#编程语言,深受游戏开发者喜爱。在这个名为“Unity恐龙快跑”的项目...

Global site tag (gtag.js) - Google Analytics