Альтернатива шаблону наблюдателя - PullRequest
7 голосов
/ 02 марта 2011

Кто-нибудь знает альтернативу шаблону Observer aka Listener?Меня интересует кое-что, что будет хорошо работать в асинхронной среде.

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

Ответы [ 5 ]

7 голосов
/ 03 марта 2011
3 голосов
/ 02 марта 2011

Если наблюдателей слишком много, поэтому наблюдаемая нить не продвигается, то, возможно, было бы разумно изменить отношения.Вместо того, чтобы наблюдаемый поток вызывал каждого наблюдателя, может быть лучше, чтобы наблюдатели ожидали чего-то вроде переменной условия или события, связанного с наблюдаемым потоком.Затем код наблюдателя может блокироваться, ожидая, пока будет передана переменная условия.Затем наблюдаемый поток может просто сигнализировать переменную условия, а не вызывать наблюдателей;наблюдатели могут заметить сигнал и обработать последствия в свое время.

1 голос
/ 04 марта 2011

Пожалуйста, посмотрите на это, если вашей основной целью является сокращение числа слушателей в вашем коде Джеффри Рихтер и его AsyncEnumerator . Эта техника делает асинхронный программист более похожим на синхронный.

С помощью этого метода ваш единственный метод может выполнить вызов Asynch и восстановить метод, выступающий в роли обработчика событий, поэтому весь код вызова и прослушивателя событий можно объединить в одну функцию.

0 голосов
/ 02 марта 2011

Трудно сказать без более конкретного описания, но шаблон Mediator связан и может использоваться, когда число взаимодействующих объектов начинает расти. Вы могли бы реализовать некоторую политику, чтобы координировать действия внутри них.

0 голосов
/ 02 марта 2011

Две альтернативы от меня: использование модели актера (например, фреймворка akka) или использование executor для ограничения распараллеливания.Executor - это просто пул потоков, который ограничивает количество потоков и повторно использует готовые потоки.

...