最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

在.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:371541
用户头像

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

关注

评论

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

北京智博会主题展|2022第十五届北京国际物联网展览会

InfoQ_caf7dbb9aa8a

Java编程中忽略这些细节,Bug肯定找上你

华为云开发者联盟

Java 编程 对象 垃圾回收 switch语句

从原理带你掌握Spring MVC拦截处理器知识

华为云开发者联盟

Spring MVC 拦截器 拦截处理器 HTTP请求

小米 x StarRocks:极致性能打造小米式性价比数据平台

StarRocks

数据库 数据分析 StarRocks

Hadoop 入门笔记—核心组件 MapRuduce

恒生LIGHT云社区

大数据 hadoop Hadoop MapReduce

云堡垒机功能包含哪些?多少钱?咨询电话多少?

行云管家

云计算 网络安全 等保评测 等保2.0

Java将增加虚拟线程,挑战Go协程

编程宝库

Java golang 并发

北京主题展|2022第十五届北京国际物联网展览会

InfoQ_caf7dbb9aa8a

论文解读丨文本行识别模型的再思考

华为云开发者联盟

数据集 文档 文本 文本识别 语言模型

建设区块链基础设施,加速区块链等新技术与传统行业深度融合发展

CECBC

提升RTC音频体验 - 从搞懂硬件开始

Wilber

音视频 RTC 3A 音频技术 音频3A

百度AI模型测试工具AI Model-Mutator亮相Black Hat Europe 2021

百度安全

AI Model-Mutator Black Hat Europe 2021

Hive 架构与表类型

五分钟学大数据

11月日更

Hi,Contributor,有一份专属周边礼包等你领取!

SphereEx

开源社区 ShardingSphere SphereEx Contributor 周边

直播 | 大数据能力体系构建的技术方法全在这了!

百度开发者中心

大数据 百度 直播 开发者沙龙

精选案例 | YRCloudFile 引领自动驾驶存储技术新趋势

焱融科技

自动驾驶 云计算 分布式 高性能 文件存储

明道云初学者如何速成报表管理系统

明道云

Supersonic Superstars挑战赛,FeoFun、Black Candy斩获大奖

货币“大动作”,中国数字货币DCEP即将落地!

CECBC

SAP UI 搜索分页技术

Jerry Wang

JavaScript Web SAP 11月日更

4 个最常见的自动化测试挑战及应对措施

禅道项目管理

自动化测试

【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例

冰河

Java 并发编程 多线程 高并发 异步编程

WebRTC DTLS | 谈谈 DTLS Fragment

泰一

DTLS

2021 年中国敏捷行业现状调查全面启动

PingCode

敏捷开发 敏捷转型 问卷调研

【等保小知识】内网或专网需要做等保测评吗?为什么?

行云管家

网络安全 等保测评 等保2.0

在浏览器里使用 SAP GUI

Jerry Wang

SAP abap SAPGUI 11月日更

研发效能提升的八项实践建议

博文视点Broadview

复杂JSON结构创建语法

FunTester

Java json 接口测试 测试开发 FunTester

数字藏品是什么?有风险吗?谁来监管?

CECBC

Hadoop 入门笔记—核心组件 HDFS

恒生LIGHT云社区

大数据 hadoop

Vue进阶(贰佰):前端UI框架介绍

No Silver Bullet

Vue UI 11月日更

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