![]() |
1
16
黑板的概念是多个独立的进程运行并更新黑板,因为它们计算出黑板的各个部分。一个典型的例子是语音识别。输入数据是要识别的音频。音频可以分段,多个线程开始将片段与单词匹配。当每一个线程找到匹配的单词时,它们会更新黑板,直到现在为止都有翻译。当短语开始组装时,另一个线程可以进行语法检查,以验证不同识别器线程所做的选择。如果一个词的可信度很低并且违反了语法,那么可以重新运行该词以寻找替代词。这甚至可能导致在解决口吃和暂停时对音频数据重新分区。 当短语变成句子时,可以采取更大的观点,并且可以解决同音词(pair,pare)的各种选择。所有这些都是通过让黑板向所有进程打开来完成的,并且“锁”只在不同的结果滚动时应用。 使用数据库作为黑板是有意义的,因为您可以“免费”获得事务,但这取决于数据更新和重新读取的程度。如果它发生得很快,那么往返行程将加起来,使内存结构更加合理。 你对中介的想法是有意义的,因为它创建了一个锁点…黑板算法很少遇到A->B,B->样式的死锁,因为它们要求前面的所有数据元素。除此之外,放弃锁并不是一个很大的惩罚,因为随着数据的进入,各种子任务将一直重新启动。委员会的订户需要在他们已经过时的数据时得到通知,这可以通过回调来完成,回调将用最新的数据重新启动任务。 至于对工作流的评论:这里的主要区别在于,大多数工作流都由一个主流程进行协调,该主流程接受刚刚输入的状态,并决定哪些状态可供数据在其中移动。虽然可能有独立的行动者,但他们很少通过创造更好的结果(其他任务将使用这些结果)来“超越”彼此。换言之,工作流通常是一组非常受约束的状态,数据通过这些状态,而黑板几乎是所有独立活动的自由。(也就是说,黑板可能在您的工作流程后面: http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf ) 我想不出我所看到的模式的任何C例子,我所做的工作类型没有太多要求(计算是确定性的)。做一些搜索可以找到其他语言的参考文献,但没有一种是高质量的。 |
![]() |
Schadre · C-plus编码错误 2 年前 |
![]() |
Nithin K · 即使类属性的类型正确,也会获取异常 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
A_K · 使用cat或打印方法打印部分内容的子集闭包 2 年前 |
![]() |
Mo Fatah · 如何使用Python类打印数独板? 2 年前 |