有人对《实用程序员》第 165 页中的 Blackboard 概念有什么想法吗?
我想要几个彼此独立的小子系统(DLL 和 EXE)。有一些程序集将被所有 EXE 使用。这些程序集几乎都使用相同的数据库。 Blackboard 类型模式不是使用接口在这些程序集之间进行通信,而是提供更多的独立性吗?
我正在考虑一些中介类型的构造,它通过事件进行通知,并且所有子系统通信都通过它。这使得 syb 系统保持非常独立。中介器将保存它应该广播的所有通知的名称。然后,订阅者将按名称侦听特定事件,但始终订阅相同的(或者可能将名称作为参数传递)中介事件。
这里还有一些关于它的讨论:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html
黑板的概念是多个独立的进程在处理黑板的各个部分时运行并更新黑板。一个典型的例子是语音识别。输入数据是要识别的音频。音频可以被分段,并且多个线程开始将片段与单词进行匹配。当每个线程找到匹配的单词时,它们会用到目前为止的翻译更新黑板。当短语开始组装时,另一个线程可以进行语法检查,以验证各个识别器线程所做的选择。如果某个单词的置信度较低且违反语法,则可以重新运行该文章以寻找替代词。当口吃和停顿得到解决时,这甚至可能导致重新分区音频数据。
当短语变成句子时,可以采取更大的视图,并且可以解决同音词(配对、配对)的各种选项。所有这一切都是通过让黑板对所有流程开放,并且仅在各种结果出现时才应用“锁定”来完成的。
使用数据库作为黑板是有意义的,因为您“免费”获得交易,但这取决于数据更新和重新读取的积极程度。如果发生得非常快,往返次数就会累加起来,使内存结构更加合理。
您对调解器的想法是有道理的,因为它创建了单个锁点......并且黑板算法很少遇到 A->B、B->A 式的死锁,因为它们预先要求所有数据元素。除此之外,放弃锁定并不是一个很大的惩罚,因为随着数据的滚入,各种子任务将一直重新启动。当董事会的订阅者所拥有的数据已经过时时,他们需要收到通知,这可以通过回调来完成,回调将使用最新数据重新启动任务。
至于关于工作流程的评论:这里的主要区别在于,大多数工作流程是由主流程协调的,该主流程采用刚刚输入的状态并决定哪些状态可供数据在其中移动。虽然可能存在独立的参与者,但他们很少通过创造更好的结果(其他任务将使用这些结果)来相互“超越”。换句话说,工作流程通常是数据经过的一组非常受限的状态,而黑板几乎是所有独立活动的自由空间。 (也就是说,黑板可能位于您的工作流程后面:http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf)
我想不出任何我见过的模式的 C# 示例,而且我所做的工作类型对此没有太多要求(计算是确定性的)。通过一些搜索找到了其他语言的参考资料,但没有一个看起来质量很高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)