代码之家  ›  专栏  ›  技术社区  ›  4thSpace wkw

有人想用这种方式使用黑板模式吗?

  •  10
  • 4thSpace wkw  · 技术社区  · 15 年前

    有人对“语用程序员”第165页的黑板概念有什么看法吗?

    我想要几个小的子系统(dll和exes),它们基本上彼此独立。有一些程序集将由所有执行人员使用。这些程序集几乎都将使用相同的数据库。黑板类型的模式不是在这些程序集之间使用接口进行通信,而是提供更多的独立性吗?

    我正在考虑一些中介类型的构造,它通过事件通知,所有子系统通信都通过它进行。这使得SYB系统非常独立。中介将保留它应该广播的所有通知的名称。然后订阅服务器将按名称侦听特定事件,但始终订阅同一个(或可能作为参数传递名称)中介事件。

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

    1 回复  |  直到 12 年前
        1
  •  16
  •   Godeke    15 年前

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

    当短语变成句子时,可以采取更大的观点,并且可以解决同音词(pair,pare)的各种选择。所有这些都是通过让黑板向所有进程打开来完成的,并且“锁”只在不同的结果滚动时应用。

    使用数据库作为黑板是有意义的,因为您可以“免费”获得事务,但这取决于数据更新和重新读取的程度。如果它发生得很快,那么往返行程将加起来,使内存结构更加合理。

    你对中介的想法是有意义的,因为它创建了一个锁点…黑板算法很少遇到A->B,B->样式的死锁,因为它们要求前面的所有数据元素。除此之外,放弃锁并不是一个很大的惩罚,因为随着数据的进入,各种子任务将一直重新启动。委员会的订户需要在他们已经过时的数据时得到通知,这可以通过回调来完成,回调将用最新的数据重新启动任务。

    至于对工作流的评论:这里的主要区别在于,大多数工作流都由一个主流程进行协调,该主流程接受刚刚输入的状态,并决定哪些状态可供数据在其中移动。虽然可能有独立的行动者,但他们很少通过创造更好的结果(其他任务将使用这些结果)来“超越”彼此。换言之,工作流通常是一组非常受约束的状态,数据通过这些状态,而黑板几乎是所有独立活动的自由。(也就是说,黑板可能在您的工作流程后面: http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf )

    我想不出我所看到的模式的任何C例子,我所做的工作类型没有太多要求(计算是确定性的)。做一些搜索可以找到其他语言的参考文献,但没有一种是高质量的。