У кого-нибудь есть мысли об использовании шаблона Blackboard таким образом? - PullRequest
10 голосов
/ 30 июля 2009

Есть ли у кого-нибудь мысли о концепции Blackboard из стр.165 «Прагматичного программиста»?

Я хочу иметь несколько небольших подсистем (DLL и EXE), в основном независимых друг от друга. Есть несколько сборок, которые будут использоваться всеми EXE-файлами. Эти сборки почти все будут использовать одну и ту же базу данных. Вместо того, чтобы использовать интерфейсы для связи между этими сборками, разве шаблон типа Blackboard не обеспечит большую независимость?

Я имею в виду некоторую конструкцию типа посредника, которая уведомляет через события, и вся подсистемная связь проходит через нее. Это сохраняет syb-системы очень независимыми. Посредник будет содержать имя всех уведомлений, которые он должен передать. Затем подписчики будут прослушивать определенное событие по имени, но всегда подписываться на одно и то же (или, возможно, передавать имя в качестве параметра) медиаторное событие.

Вот еще несколько обсуждений: http://www.experts -exchange.com / Программирование / Языки / C_Sharp / Q_22829492.html

1 Ответ

16 голосов
/ 31 июля 2009

Концепция классной доски заключается в том, что несколько независимых процессов запускаются и обновляют классную доску, когда они ее обрабатывают. Классическим примером является распознавание речи. Входными данными является звук, который должен быть распознан. Аудио может быть сегментировано, и несколько потоков начинают сопоставлять фрагменты со словами. Когда каждый поток находит подходящие слова, он обновляет доску с переводом до этого момента. Когда фразы начинают собираться, другой поток может выполнить проверку грамматики, чтобы проверить выбор, который делают различные потоки распознавателя. Если слово имеет низкую достоверность и нарушает грамматику, произведение может быть перезапущено в поисках альтернатив. Это может даже привести к перераспределению аудиоданных при разрешении заиканий и пауз.

По мере того, как фразы становятся предложениями, могут быть взяты еще более широкие представления и разрешены различные варианты гомофонов (пара, пара). Все это достигается за счет того, что доска открыта для всех процессов и «блокировки» применяются только по мере появления различных результатов.

Использование базы данных в качестве вашей доски имеет некоторый смысл, потому что вы получаете транзакции «бесплатно», но это будет зависеть от того, насколько активно данные обновляются и перечитываются. Если это происходит очень быстро, круговые поездки суммируют и делают структуру памяти более разумной.

Ваша идея о посреднике имеет смысл, поскольку она создает единую точку блокировки ... и алгоритмы классной доски редко встречают взаимоблокировки стиля A-> B, B-> A, потому что они запрашивают все элементы данных заранее. Кроме того, отказ от блокировки не является большим штрафом, так как различные подзадачи будут перезапускаться все время по мере поступления данных. Подписчики на плате должны будут получать уведомления, когда данные, которые они имеют, устарели, что можно сделать с помощью обратных вызовов, которые перезапустят задачу с самыми новыми данными.

Что касается комментария о рабочем процессе: основное отличие здесь состоит в том, что большинство рабочих процессов координируются главным процессом, который принимает только что введенное состояние и принимает решения относительно того, какие состояния становятся доступными для перемещения данных. Несмотря на то, что могут быть независимые актеры, они редко вовлекаются в «превосходство» друг друга, создавая лучшие результаты (которые затем будут использовать другие задачи). Другими словами, рабочий процесс обычно представляет собой очень ограниченный набор состояний, через которые проходят данные, в то время как классная доска является практически бесплатной для всех независимых действий. (Тем не менее, за вашим рабочим процессом может находиться доска: http://sunsite.informatik.rwth -aachen.de / Publications / CEUR-WS / Vol-247 / FORUM_15.pdf )

Я не могу вспомнить ни одного примера C # паттерна, который я видел, и тип работы, который я выполняю, почти не требует этого (вычисления детерминированы). При выполнении некоторых поисков можно найти ссылки на других языках, но ни один из них не выглядит качественно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...