Может ли Parallel.ForEach безопасно использоваться с CloudTableQuery - PullRequest
0 голосов
/ 08 сентября 2010

У меня есть достаточное количество записей в таблице Azure, для которых я пытаюсь выполнить какое-то одноразовое шифрование данных. Я думал, что смогу ускорить процесс, используя Parallel.ForEach. Кроме того, поскольку записей больше 1 КБ, и я не хочу возиться с токенами продолжения самостоятельно, я использую CloudTableQuery для получения моего перечислителя.

Моя проблема в том, что некоторые из моих записей были зашифрованы дважды, и я понял, что я не уверен, насколько потокобезопасен перечислитель, возвращенный CloudTableQuery.Execute(). Кто-нибудь еще имел опыт работы с этой комбинацией?

Ответы [ 2 ]

1 голос
/ 13 января 2011

Несмотря на все мои усилия, я не смог воспроизвести мою первоначальную проблему.Поэтому я пришел к выводу, что вполне нормально использовать петли Parallel.ForEach с CloudTableQuery.Execute().

1 голос
/ 30 ноября 2010

Я был бы готов поспорить, что ответ на Execute вернет поточно-ориентированную IEnumerator реализацию крайне маловероятно.Тем не менее, это звучит как еще один случай для шаблона «производитель-потребитель» .

В вашем конкретном сценарии я хотел бы, чтобы исходный поток с именем Execute считывал результаты последовательно и вставлял их вBlockingCollection<T>.Однако прежде чем вы начнете это делать, вы хотите запустить отдельный Task, который будет контролировать потребление этих предметов, используя Parallel::ForEach.Теперь вы, вероятно, также захотите изучить использование GetConsumingPartitioner метода библиотеки ParallelExtensions, чтобы быть наиболее эффективным, так как разделитель по умолчанию создаст больше служебных данных, чем вы хотите в этом случае.Вы можете узнать больше об этом из этого сообщения в блоге .

Дополнительный бонус использования BlockingCollection<T> над необработанным ConcurrentQueueu<T> заключается в том, что он предлагает возможность устанавливать границы , что может помешать производителю добавлять в коллекцию больше товаров, чем потребители могут не отставать.Конечно, вам нужно будет провести тестирование производительности, чтобы найти подходящее место для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...