Динамическая обработка параллельной коллекции параллельно по группам, но последовательно внутри каждой группы.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Динамическая обработка параллельной коллекции параллельно по группам, но последовательно внутри каждой группы.

Сообщение Anonymous »

Я столкнулся с проблемой, которую могу легко определить, но, хоть убей, не могу разобраться в MSDN в поисках наилучшего возможного решения. Прошло много времени с тех пор, как мне приходилось думать о параллельной обработке за пределами отзывчивости пользовательского интерфейса.
Скажем, у меня есть параллельная коллекция задач, которые необходимо обработать. Например, возможно, это загрузка данных различным потребителям по типу (Consumer1, Consumer2, Consumer3...Consumer[N]). Базовая задача отправки данных одинакова для каждой задачи, но каждый потребитель может принимать только один источник одновременно.
По сути, я хочу обрабатывать как можно больше параллельно, но с оговоркой, что я могу отправлять только одну задачу каждому потребителю одновременно. Таким образом, если текущее задание для потребителя уже выполняется, мне следует перейти к следующему элементу в коллекции и оставить его до завершения текущего задания для этого потребителя. Коллекцию Concurrent можно также добавить в любое время извне, и если бы у нас были новые типы, нам потребовались бы дополнительные потоки.
Полагаю, мой вопрос сводится к тому, как мне настроить «Взять» из коллекции, чтобы я мог получить только следующую задачу со свойством, которое указывает, что у нее есть Потребитель, у которого еще нет выполняемого задания.
Любые идеи по поводу того, что я могу сделать меня здесь не хватает или я вообще на правильном пути?
Пример: у нас есть очередь посредника с задачами, связанными с банковскими транзакциями.
Поэтому мы могли бы добавить в нашу очередь посредника (скажем, send SummaryData и Send TransactionData используют один и тот же контракт интерфейса для отправки данных)
  • SendTransactionData -> Bank1
    SendTransactionData -> Банк2
  • SendSummaryData -> Арбитр
  • SendTransactionData -> Банк1
  • SendTransactionData -> Bank3
  • SendTransactionData -> Bank1
  • SendTransactionData -> Bank2
1,2,3,5 могут обрабатываться параллельно, но из-за их собственных систем каждый потребитель может принимать только один вход за раз, транзакция 4 должна ждать завершения транзакции 1, а транзакция 6 должен дождаться обработки транзакции 4. Аналогично, транзакция 7 должна дождаться транзакции 2.
Прежде чем какой-либо из начальных процессов завершится, кто-то может добавить еще одну группу.
  • SendSummaryData -> Арбитр
  • SendTransactionData -> Bank1

    SendTransactionData -> Bank4
10 можно забрать немедленно, если поток доступен, но 8 и 9 должны быть поставлены в очередь после других связанных с ними задач.
Очевидно, что были бы лучшие способы спроектировать систему для достижения этой цели, но по сути это те спецификации, которые я Я ищу удовлетворения.

Подробнее здесь: https://stackoverflow.com/questions/710 ... t-serially
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»