有人对《实用程序员》第165页的黑板概念有什么想法吗?
我希望有几个小的子系统(dll和exe)基本上彼此独立。有一些程序集将被所有的exe使用。这些程序集几乎都使用同一个数据库。与其使用接口在这些程序集之间进行通信,黑板类型的模式难道不能提供更多的独立性吗?
我正在考虑一些中介类型的构造,它通过事件通知,所有子系统通信都通过它。这使得syb系统非常独立。中介将保存它应该广播的所有通知的名称。订阅者随后将按名称侦听特定事件,但始终订阅同一(或可能作为参数传递名称)中介事件。
这里还有一些关于它的讨论:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html
最佳答案
黑板的概念是,多个独立的进程运行并更新黑板,当它们计算出黑板的碎片时。一个典型的例子是语音识别。输入数据是要识别的音频。音频可以被分割,多个线程开始匹配片段到单词。当每个线程找到匹配的单词时,它们会用翻译更新黑板直到现在。当短语开始组装时,另一个线程可以进行语法检查,以验证各种识别器线程所做的选择。如果一个单词的置信度较低,并且违反了语法,则可以重新选择该段。这甚至可能导致在解决口吃和暂停时重新划分音频数据。
当短语变成句子时,甚至可以采取更大的观点,并且可以解决同音词(配对、PARE)的各种选项。所有这些都是通过让黑板对所有进程打开来完成的,并且“锁”只在各种结果进入时才被应用。
使用数据库作为黑板有些道理,因为您可以“免费”获得事务,但这取决于数据更新和重新读取的积极性。如果这种情况发生得很快,往返的次数就会增加,使内存结构更加合理。
你对中介的想法很有意义,因为它创建了一个锁点…黑板算法很少遇到a->b,b->a风格的死锁,因为它们要求所有数据元素都在前面。除此之外,放弃锁并不是一个很大的惩罚,因为随着数据的滚动,各种子任务将一直重新启动。当用户的数据过时时,需要通知他们,这可以通过回调来完成,回调将用最新的数据重新启动任务。
关于工作流的评论:这里的主要区别在于,大多数工作流由一个主流程协调,该主流程接受刚刚输入的状态,并决定哪些状态可供数据在其中移动。虽然可能有独立的参与者,但他们很少通过创造更好的结果(然后其他任务将使用这些结果)来参与“超越”彼此。换言之,工作流通常是数据通过的一组非常受限的状态,而黑板几乎是所有独立活动的自由空间。(也就是说,你的工作流程后面可能有一块黑板:http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf)
我想不出我见过的任何模式的例子,我所做的工作并没有太多的要求(计算是确定性的)。做一些搜索可以找到其他语言的引用,但是没有一个是高质量的。