有人想过用这种方式使用Blackboard Pattern吗?

4th*_*ace 10 .net c# oop design-patterns

有没有人对"实用程序员"的第165页对Blackboard概念有任何想法?

我希望有几个小的子系统(DLL和EXE)大多相互独立.有些程序集将由所有EXE使用.这些程序集几乎都使用相同的数据库.而不是使用接口进行这些程序集之间的通信,Blackboard类型模式不会提供更多的独立性吗?

我正在考虑一些中介类型构造,它通过事件通知并且所有子系统通信都通过它.这使syb系统非常独立.调解员将保留其应广播的所有通知的名称.然后,订阅者将按名称侦听特定事件,但始终订阅相同(或可能传递名称作为参数)中介事件.

以下是对它的更多讨论:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html

God*_*eke 16

黑板的概念是多个独立的进程运行并更新黑板,因为它们计算出它的一部分.一个典型的例子是语音识别.输入数据是要识别的音频.可以对音频进行分段,并且多个线程开始将片段与单词匹配.当每个线程找到匹配的单词时,他们会使用到此时的翻译更新黑板.当短语开始组装时,另一个线程可以进行语法检查以验证各种识别器线程正在做出的选择.如果一个单词的置信度低并且违反了语法,则可以重新运行该单词以寻找替代方法.这甚至可能导致在解决断续续续和暂停时重新分区音频数据.

当短语成为句子时,可以拍摄更大的视图,并且可以解决同音异义词(配对,削减)的各种选项.所有这一切都是通过让黑板对所有进程开放来完成的,并且只有在各种结果滚动时才应用"锁定".

使用数据库作为黑板是有道理的,因为您"免费"获得交易,但这取决于数据的更新和重新读取的积极程度.如果它发生得很快,往返会加起来并使内存结构更合理.

你对中介的想法是有意义的,因为它创建了一个单一的锁定点......而黑板算法很少遇到A-> B,B-> A样式死锁,因为它们预先要求所有数据元素.除此之外,放弃锁定并不是一个很大的损失,因为随着数据的推出,各种子任务将一直重新启动.当他们拥有的数据已经过时时,需要通知董事会的订户,这可以通过回调完成,这将使用最新数据重新启动任务.

至于关于工作流的评论:这里的主要区别在于大多数工作流由主进程协调,该进程采用刚进入的状态,并决定哪些状态可用于数据移动.虽然可能有独立的参与者,但他们很少通过创造更好的结果(其他任务将使用)来参与彼此"超越".换句话说,工作流通常是一组非常有限的状态数据,数据通过,而黑板几乎是一个免费的所有独立活动.(也就是说,黑板可能在你的工作流程背后:http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf)

我想不出我所看到的模式的任何C#示例,我所做的工作类型没有太多要求它(计算是确定性的).做一些搜索可以找到其他语言的引用,但没有一个看起来质量很好.

  • 对于具有一些警告的分布式应用程序来说,这似乎是一种合理的模式 首先,它通常用于实时或近实时场景,其中更复杂模型的开销(可能更容易避免冗余计算)被快速更新所抵消,从而为其他过程提供更好的基线数据.第二个警告是黑板交换带宽收敛速度:更新/通知周期可能导致大量冗余重新读取. (2认同)