Что в реальном мире используется для ConcurrentBag <T>? - PullRequest
16 голосов
/ 23 июня 2011

ConcurrentBag позволит нескольким потокам добавлять и удалять предметы из сумки.Возможно, что нить добавит предмет в сумку, а затем заберет тот же самый предмет обратно.Это говорит о том, что ConcurrentBag неупорядочен, но насколько он неупорядочен?На одной нити сумка действует как стек.Неупорядоченный означает «не похоже на связанный список»?

Что в реальном мире используется для ConcurrentBag?

Ответы [ 4 ]

16 голосов
/ 20 июля 2012

Поскольку не существует порядка, ConcurrentBag имеет преимущество в производительности перед ConcurrentStack / Queue. Это реализовано Microsoft как локальное хранилище потоков. Таким образом, каждый поток, который добавляет элементы, делает это в своем собственном пространстве. При получении предметов они поступают из локального хранилища. Только когда это пусто, поток крадет элемент из хранилища другого потока. Таким образом, вместо простого списка ConcurrentBag представляет собой распределенный список элементов. И почти без блокировки и должен масштабироваться лучше с высоким параллелизмом.

К сожалению, в .NET 4.0 возникла проблема с производительностью (исправлена ​​в 4.5), см. http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0

2 голосов
/ 23 июня 2011

Сумки действительно полезны для отслеживания количества экземпляров. Например, если вы хотите вести учет того, для каких хостов вы обслуживаете веб-запросы, вы можете добавить их IP-адрес в пакет, когда начнете обслуживать запрос, и удалить его, когда закончите.

Использование пакета позволит вам сразу определить, какие IP-адреса вы обслуживаете в настоящее время. Это также позволит вам быстро запросить, обслуживаете ли вы данный IP-адрес.

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

1 голос
/ 23 июня 2011

Благодаря @Chris Jester-Young я придумал хороший, реальный мир, сценарий, который на самом деле применим к проекту, над которым я работаю.

Поиск - Процесс - Магазин

Найти - потоки 1 и 2 настроены на поиск или очистку данных (файловая система, Интернет и т. Д.).Эти результаты хранятся в ConcurrentBag1.

Процесс - потоки 3 и 4 настроены на извлечение из ConcurrentBag1, очистку / преобразование / обработку данных и затем сохранение результатов в ConcurrentBag2.

Store - потоки 5 настроены на сбор результатов из ConcurrentBag2 и сохранение результатов в SQL.

1 голос
/ 23 июня 2011

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

...