Как мне спроектировать свой рабочий процесс, чтобы taks мог работать параллельно - PullRequest
0 голосов
/ 29 июля 2011

как спроектировать рабочий процесс параллельной обработки

У меня есть сценарий анализа данных.

Существует четыре основных шага:

  1. забрать задачу либо прочитать из очереди, либо получить сообщение через API (возможно, веб-сервис), чтобы запустить службу

  2. отправить запрос в базу удаленных услуг по параметрам из шага1

  3. ожидание от удаленной службы завершено и загрузка

  4. выполняет обработку данных, загруженных с шага 3

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

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

Так можем ли мы настроить фундамент рабочего процесса Windows для параллельной работы?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

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

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

Что работает лучше всего, зависит от вашего сценария.

0 голосов
/ 29 июля 2011

Вы можете использовать pfx (http://www.albahari.com/threading/part5.aspx),, тогда вы можете контролировать, сколько потоков создать для извлечения, и с помощью PLINQ я нахожу полезным.

Итак, вы перебираете список URL-адресов, возможно, читаете из файла или базы данных, а затем в своем выборе вы можете вызвать функцию для выполнения обработки.

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

UPDATE:

Вот как я бы подошел к этому, но я также использую ConcurrentQueue (http://www.codethinked.com/net-40-and-system_collections_concurrent_concurrentqueue), поэтому я могу помещать данные в очередь во время чтения из нее.

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

            Parallel.For(0, queue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
                (j) =>
                {
                   String i;
                   queue.TryDequeue(out i);
                   // call out to URL
                   // process data
                }
            });

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

...