Для использования многопоточности, является ли шаблон Command более полезным, чем шаблон Decorator? - PullRequest
1 голос
/ 22 мая 2011

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

Однако шаблон Decorator, по-видимому, имеет ограничение, согласно которому все должно происходить в одном потоке, поскольку декоратор должен вызывать делегат напрямую, подразумевая, что он должен быть в одном потоке.

Правильно ли я понимаю это ограничение? Наоборот, возможно ли запустить декоратор на нескольких потоках?


Я пытаюсь реализовать конвейер, который обрабатывает поток данных.

  • Для реализации в виде шаблона Command его метод execute будет принимать два аргумента: буфер для ввода и буфер для вывода.
  • Для реализации в качестве шаблона Decorator его метод getdata будет вызывать свой делегат для получения результата предыдущего шага, применять свою собственную обработку и возвращать результат вызывающей стороне.

Однако после того, как я реализовал его в обоих стилях, я обнаружил, что у каждого есть ограничения, которые мне изначально не были понятны.

  • При использовании шаблона Command я могу начать принимать больше входных данных, используя новый буфер, в то время как более ранние буферы обрабатываются некоторыми командами, работающими в отдельных рабочих потоках. Кажется, я не могу сделать это с шаблоном Decorator.
  • При использовании шаблона Decorator, декоратор может сделать любое количество вызовов своему делегату и иметь возможность объединить результаты в один фрагмент. Он также может разделять данные, делая один большой запрос, кэшируя его, а затем возвращая его части. Когда я использую шаблон команды с одним входным буфером и одним выходным буфером, не может быть никакой комбинации или разделения результатов.

1 Ответ

1 голос
/ 22 мая 2011

Возможность запуска Decorators в любом потоке определяется реализацией:)

Если ваши декораторы безопасны для потоков ... да. Если нет: добавьте синхронизацию. Это может подорвать вашу производительность.

Однако, на мой взгляд, для декораторов имеет смысл в основном заниматься объектом, который они украшают, и только маленькими кусочками контекста / состояния вне этого. Декорируемый здесь объект, очевидно, в первую очередь должен быть ориентирован на многопоточность (или быть осведомленным), иначе он будет иметь такую ​​же проблему даже без декоратора.

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

Но принципиально ничто не мешает (в общем) декоратору выполняться в любом потоке, который вы хотите .

...