写点什么

在.NET 应用程序中进行 Erlang 风格的并行编程(第 1 部分)——CCR

  • 2008-12-22
  • 本文字数:1515 字

    阅读完需:约 5 分钟

Erlang 能够用来编写高度可伸缩的并行应用程序,其中经常会出现数以百万计的轻量级组件,这种类似于线程的组件被称之为 actor。不幸的是,这往往需要您使用 Erlang 这种相对神秘的编程语言重写所有代码。不过我们也有其他选择,例如使用名不见经传的 CCR 平台来进行开发,该平台由.NET 机器人部门开发。

作为一种基于 Actor 的语言,Erlang 通过 Actor 模型能够实现高度并发性。在这个模型中,最基础的并行单元不是线程或纤程(fiber) ,而是一种更为轻量级的东西。作为 Erlang 中的“进程”,每个并行单元在一个 32 位系统中只占用大约 1200 字节的基础资源。与此相对的是,Windows 操作系统中的每个线程默认会在栈上分配 1MB 空间,此外还需要额外的空间来作为簿记(Bookkeeping)和线程本地存储。由于非常轻量,一个应用程序轻松支持百万计的进程进行并发处理。

在任一时刻,大部分的进程处于空闲状态。当一个进程接受到了一条消息,运行平台将为其分配一个线程来应答这条消息。一条应答可能会创建一个新的进程,向其他进程发送消息,或者改变自身状态。一旦消息被处理之后,这个进程将会死亡,或者继续等待下一条消息。

消息处理系统实现了高端的并行性和高性能。每条消息都为异步发送,使得进程之间相互高度独立。平台能够通过消息来得知应该唤醒哪个进程。由于每个进程都能被任意的线程来处理,因此就可以大大减少耗费相对昂贵的上下文切换操作。

.NET 中使用 CCR,也就是 Coordination Currency Runtime 作为 Erlang 模型的回应。CCR 原本面向机器人平台,正在设法扩展更广阔的市场。 Siemens Automation 的一个开发人员只花了几年时间就将 CCR 集成进他们目前的 Blackboard 代码库。Blackboard 是一个使用 AI 代理和传送带将信件以 10 米每秒的速度进行分发的系统,包含数百万行遗留代码。 Tyco 是个负责从小商店到白宫的各种事情的安全公司,也在数周内与 CCR 进行了集成。这些并非是推销性质的案例,Siemens 和 Tyco 没有借助微软的帮助就完成了大量的工作。

CCR 的核心是一个名为“端口(port)”的 API 级别的概念。有别于以往调用类方法的方式,开发人员使用向端口发送消息来执行操作。附加在端口上的调控器会读取消息,如果它们符合特定的标准,就会将消息成批地交给任务进行处理。任务会被放进分发队列中,稍后就会被线程池执行。

调控器形成了调度单元的基础。它们可以只是个简单地单个端口的接收器,或多个端口的联合 / 选择接收器。如果需要更复杂的逻辑,它们甚至可以进行各种组合。不过它们的最终目的只有一个,那就是在收到数据时唤醒并执行一系列代码。

CCR 的真正威力来自 C#的迭代器语法“yield return”。Yield return 是一种延续的方式,它不会挂起一个真正的线程,而实现暂停线程执行并在以后唤醒的效果。这个特性一般用于迭代,不过结合了 CCR 就能扩展为任意类型的异步操作。这样做的最大好处是不需要大规模修改您的现有代码。

2008 PDC 中的这段示例代码展示了如何使用端口来发起一个异步调用。与阻塞方式,或者在异步调用模式中使用显式回调函数的方式不同,我们只要简单的通过 yield return 语句来跳出函数即可。当获得数据,同时有空余线程时,函数就会“毫不知情”地从下一行代码开始继续执行。

<p>fs.BeginRead(buffer, 0, buffer.Length, arPort.Post, null);</p><p>// yield until stream posts IAsyncResult on the CCR port</p><p>yield return arPort.Receive();</p><p>// extract result, it must be in the port</p><p>var ar = (IAsyncResult)arPort.Test();</p><p>int read = fs.EndRead(ar);</p>CCR 有望被包含在.NET 4.0/Visual Studio 2010 中。

查看英文原文: Erlang Style Concurrency for .NET Applications Part 1 - CCR

2008-12-22 06:372127
用户头像

发布了 157 篇内容, 共 62.9 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

百度数据可视化Sugar BI:数据监控与预警

百度开发者中心

大数据 百度智能云 sugar

软件测试 | 从手工转到测试开发,是种什么样的体验?

测吧(北京)科技有限公司

测试

即刻报名|Kyligence 指标平台产品发布会

Kyligence

数据分析 指标平台

测试开发岗面试前需要准备哪些内容呢?一节课带你搞定

测吧(北京)科技有限公司

测试

文心一言更大的故事是在云计算

百度开发者中心

百度智能云 文心一言

面向 Web、微服务应用的 Serverless 托管平台云应用引擎 CAE

宇宙之一粟

云服务器 CAE 云应用

微软云与 OpenAI 竞争 ChatGPT 企业级客户:安全性、老客户、多云、模型迭代效率

B Impact

Nexus3 环境配置

流火

nexus3 群晖 maven私服

NFT钱包开发链游系统搭建技术

薇電13242772558

NFT

又见版本升级!一句话概括 Milvus 2.2.4:资源隔离、多云、高效

Zilliz

非结构化数据 Milvus Zilliz

周鸿祎谈“360GPT”两翼齐飞战略;SaaS生态百家接入、120万家企业用户、2千万终端用户

B Impact

百度数据可视化Sugar BI:实时滚动地图大屏

百度开发者中心

大数据 百度智能云 sugar

火焰杯”软件测试开发选拔赛河北赛区颁奖典礼落幕

测吧(北京)科技有限公司

测试

测试工具也有程序错误

测吧(北京)科技有限公司

测试

大数据培训学习需要到什么程度

小谷哥

应对网络不可靠挑战,用 OpenYurt 实现边缘业务连续性

阿里巴巴云原生

阿里云 开源 云原生 openyurt

让创新更多元,让世界更美好,2023女性影响力峰会圆满举办

创业邦

不降功能只降资源,六个应用场景带你了解OCP Express

OceanBase 数据库

数据库 oceanbase

商业智能公厕系统

光明源智慧厕所

智慧城市

java线下面授培训,还是自学好?

小谷哥

百度数据可视化Sugar BI:工业零部件3D大屏

百度开发者中心

大数据 百度智能云 sugar

软件测试 | 低学历无未来?从小公司到拿下年薪45W+,这个小哥哥好励志~

测吧(北京)科技有限公司

测试

数字云南的那山,那水,那些人

脑极体

5G

极光笔记 | 如何在Shopify中使用Engagelab(上)

极光GPTBots-极光推送

市场营销 邮件发送 用户运营

小程序容器技术——组装式应用架构的新型实践

没有用户名丶

小程序容器

出手即不凡,一年共投408个公司,人均退出近5个 | 创业邦2023女性投资人榜单发布

创业邦

百度数据可视化Sugar BI:业务自助BI分析

百度开发者中心

百度云 大数据 sugar

什么叫软件测试?如何学习?

测吧(北京)科技有限公司

测试

Cocos携手乐元素 《开心消消乐》成功移植OpenHarmony

最新动态

百度数据可视化Sugar BI:问卷数据收集、分析与展现

百度开发者中心

大数据 百度智能云 sugar

在.NET应用程序中进行Erlang风格的并行编程(第1部分)——CCR_.NET_Jonathan Allen_InfoQ精选文章