有没有人对“实用程序员”第165页对Blackboard概念有任何想法?
我希望有几个小的子系统(DLL和EXE)大多彼此独立。有些程序集将由所有EXE使用。这些程序集几乎都使用相同的数据库。而不是使用接口进行这些程序集之间的通信,Blackboard类型模式不会提供更多的独立性吗?
我正在考虑一些通过事件通知并且所有子系统通信都通过它的中介类型构造。这使syb系统非常独立。调解员将保留其应广播的所有通知的名称。然后,订阅者将按名称侦听特定事件,但始终订阅相同(或可能传递名称作为参数)中介事件。
以下是对此的更多讨论:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html
答案 0 :(得分:16)
黑板的概念是多个独立的进程运行并更新黑板,因为它们可以计算出黑板。一个典型的例子是语音识别。输入数据是要识别的音频。可以对音频进行分段,并且多个线程开始将片段与单词匹配。当每个线程找到匹配的单词时,他们会使用到此时的翻译更新黑板。当短语开始组装时,另一个线程可以进行语法检查以验证各种识别器线程正在做出的选择。如果一个单词的置信度低并且违反了语法,则可以重新运行该单词以寻找替代方法。这可能会导致音频数据重新分区,因为解决了断断续续的停顿。
当短语成为句子时,可以拍摄更大的视图,并且可以解决同音异义词(配对,削减)的各种选项。所有这一切都是通过让黑板对所有进程开放来完成的,并且只有在各种结果滚动时才应用“锁定”。
使用数据库作为黑板是有道理的,因为您可以“免费”获得交易,但这取决于数据的更新和重新读取的积极程度。如果它发生得很快,往返会加起来并使内存结构更合理。
你对中介的想法是有意义的,因为它创建了一个锁定点...黑板算法很少遇到A-> B,B-> A样式死锁,因为它们预先要求所有数据元素。除此之外,放弃锁定并不是一个很大的损失,因为随着数据的推出,各种子任务将一直重新启动。当他们拥有的数据已经过时时,需要通知董事会的订户,这可以通过回调完成,这将使用最新数据重新启动任务。
就工作流程的评论而言:这里的主要区别在于,大多数工作流程都由一个主流程协调,该流程采用刚刚输入的状态,并决定哪些状态可供数据移动。虽然可能有独立的参与者,但他们很少通过创造更好的结果(其他任务将使用)来参与彼此“超越”。换句话说,工作流程通常是一组非常有限的状态,数据通过这些状态,而黑板对于所有独立活动几乎都是免费的。 (也就是说,黑板可能在您的工作流程后面:http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf)
我无法想到我所看到的模式的任何C#示例,而我所做的工作类型并没有太多的要求(计算是确定性的)。做一些搜索可以找到其他语言的引用,但没有一个看起来质量很好。