BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Dataflow:Ruby的声明式并发控制模型

| 作者 Sebastien Auvray 关注 0 他的粉丝 ,译者 胡振波 关注 0 他的粉丝 发布于 2009年5月13日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

由于Ruby语言受到了一些函数式程序设计技术的影响,有些Ruby程序员随之采纳了Erlang或者Haskell的思想,甚者建立起了从Ruby到这些语言的桥梁,比如:Erlectricity

Larry Diehl基于Oz语言的Unification概念,为Ruby引入了声明式并发控制模型。Oz是一种多维编程语言,它主要作为一种函数式(包括延迟计算和即时计算)、分布式和并发编程语言而著称,但同时它也支持约束、逻辑、命令式和面向对象编程。

随着计算机中核心处理器数量的不断增加,Larry希望声明式并发模型能给Ruby语言带来一些好处

  • 更加易读的代码
  • 简单但强大的并发控制

为了实现这个目标,Larry应用了《Concepts, Techniques, and Models of Computer Programming》一书中描述的数据流线程行为(Dataflow threading behavior)概念:

如果一个操作试图使用一个未绑定的变量,该怎么办?如果纯粹从审美角度来看,这个操作应该等待,直到其它线程绑定了这个变量再继续进行。这种“文明礼貌”的线程行为被称之为数据流线程行为(Dataflow threading behavior)。

为了用Oz实现这个概念,Larry应用了Unification:

Unification的思想是用逻辑方程来描述值,而逻辑方程可以自动被一些合一算法(unification algorithm)所解决。

那么在实际应用中,我们就可以这样编写代码了(这段代码来自Dataflow项目网站):

# Local variables
include Dataflow

local do |x, y, z|
  # notice how the order automatically gets resolved
  Thread.new { unify y, x + 2 }
  Thread.new { unify z, y + 3 }
  Thread.new { unify x, 1 }
  z #=> 6
end

用local或者declare(实例变量)创建一些变量,然后用unify来绑定这些变量。

Oz Ports(非确定行为)或者Erlang化Actors就是两个很好的例子。

但Brian Morearty也指出了对Dataflow调试、性能和内存的一些有意思的担心 。随后Larry Diehl在Brian的博客中进行了解释

有一点需要注意的是,由于这个库支持绿色线程(green threads)和本地线程池实现,它已经让JRuby在MRI上光芒四射了。

查看英文原文:Declarative Concurrency For Ruby With Dataflow

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT