BT

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

Concurrent Basic——基于消息并发的声明式语言

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 张逸 关注 12 他的粉丝 发布于 2009年3月12日. 估计阅读时间: 8 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

Concurrent Basic初现Visual Basic未来发展端倪。虽然它建立在C#在研语言例如Polyphonic C#和C-Omega的工作基础之上,然而,Visual Basic之所以对其青眼有加,还是在于它具备声明式编程的固有特征。VB的声明式事件处理器激发了这一语法灵感。

关键字

  • Asynchronous——表示消息队列的方法。
  • Synchronous——表示请求队列的方法。
  • When——用于表现双方的异步和同步事件。

下面是使用这些关键字实现的完整示例,它定义了一个线程安全的缓冲区Buffer。

Class Buffer(Of T) 
 Asynchronous Sub Put (t as T) 
 Synchronous Function Take() as T 
 Function React (t as T) as T When Put, Take 
 Return T 
 End Function 
End Class

函数Put可以被用户异步调用。Take函数在调用时会阻塞线程,直到最后一项被Put取出。React函数处理的实现细节是通过Put将队列中的对象转换为Take所期望的形式。

下面是两个更复杂的示例。第一个示例会等待A或者B上的一条消息。第二个示例则等待A和B都有消息时才终止。

Class Either(Of T)
 Asynchronous Sub PutA(t as T) 
 Asynchronous Sub PutB(t as T) 
 Synchronous Function TakeEither() as T 
 Function ReactA(t as T) as T When TakeEither, PutA 
 Return T 
 End Function 
 Function ReactB(t as T) as T When TakeEither, PutB 
 Return T 
 End Function 
End Class 
Class Both(Of T, U) 
 Asynchronous Sub PutA(t as T) 
 Asynchronous Sub PutB(u of U) 
 Synchronous Function TakeBoth() as T 
 Function React(t as T, u as U) as Pair(Of T, U) When Take, PutA, PutB 
 Return new Pair(Of T, U)(t, u) 
 End Function 
End Class

下面的例子是一种单位置缓冲(one place buffer)模式,这种缓存每次最多只能存储一条消息。

Class OPB(of T) 
 Sub New 
 Empty() 
 End Sub 
 Synchronous Sub Put (t as T) 
 Synchronous Function Take() as T 
 Private Asynchronous Empty() 
 Private Asynchronous Full(of T) 
 Sub PutAndEmpty(t as T) When Put, Empty 
 Full(t) 
 End Sub 
 Sub TakeAndFull(t as T) as T When Take, Full 
 Empty() 
 Return t 
 End Sub 
End Class 

如果深入分析,Put、Take、Empty与Full函数均体现了内部队列。执行相关的React方法则是通过对When子句与队列大小进行模式匹配。

迄今给出的示例均假定Take方法是同步的。然而这却并非必然,你也可以使用回调。 

Class AsyncBuffer(Of T) 
 Asynchronous Sub Put (t as T) 
 Asynchronous Function Take() as T 
 Function React (callback as Func(t as T), t as T) as T When Put, Take 
 Return callback(t) 
 End Function 
End Class 

使用该方法时,将引发一个线程执行React和回调方法。某些开发人员可能需要执行其他工作,例如使用一个线程池、GUI线程或者其他线程库。为此,你需要实现ContinuationAttribute。以下是该特性的定义。

Public MustInherit Class ContinuationAttribute 
 Inherits Attribute 
 Public MustOverride Sub BeginInvoke( task As Continuation) 
 Public MustOverride Sub Invoke( task As Continuation) 
End Class 
Public Delegate Sub Continuation() 

示例与用法

Public Class MyThreadPoolAttribute 
 Inherits ContinuationAttribute 
 Public Overrides Sub BeginInvoke( task As Continuation) 
 ThreadPool.Enqueue(task) 
 End Sub 
 Public Overrides Sub Invoke( task As Continuation) 
 task() 
 End Sub 
End Class 

Class AsyncBuffer(Of T)
Asynchronous Sub Put (t as T)
Asynchronous Function Take() as T
Function React (callback as Func(t as T), t as T) as T When Put, Take
Return callback(t)
End Function
End Class

更多信息可以观看Channel 9的视频以及阅读文档Concurrent Basic的提议

查看英文原文:Concurrent Basic – A Declarative Language for Message-Based Concurrency.

 

评价本文

专业度
风格

您好,朋友!

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

获得来自InfoQ的更多体验。

告诉我们您的想法

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

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

呵呵 by li albert

并发基础?
这词翻译的,OH My God!
应该把Visual Basic翻译成“可视化基础”
呵呵

并发基础? 是并发Basic吧. by Zhang Steven

并发基础? 是并发Basic吧.

Re: 呵呵 by 张 逸

兄弟大意了啊!其实不翻译更好。谢谢楼上的回复。

允许的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通知我

3 讨论

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


找回密码....

Follow

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

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

Like

内容自由定制

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

Notifications

获取更新

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

BT