`
qiezi
  • 浏览: 497229 次
  • 性别: 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目录的...

    环保行业重大事件快评: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