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

  • Jonathan Allen
  • 张逸

2009 年 3 月 11 日

话题:.NET语言 & 开发架构

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.

.NET语言 & 开发架构