Я хочу выполнить запрос по потоку данных при обработке элементов параллельно с определенной степенью параллелизма. Обычно я использую PLINQ для этого, но мои рабочие элементы не связаны с ЦП, а связаны с IO. Я хочу использовать async IO. PLINQ не поддерживает работу async.Есть ли асинхронная версия PLINQ?
Каков самый умный способ запуска запроса в стиле PLINQ, но с асинхронными рабочими элементами?
Вот более подробные иллюстрации проблемы:
Моя цель состоит в том, чтобы обрабатывать потенциально бесконечный поток «элементов» в пути, который логически описывается следующим запросом:
var items = new int[10]; //simulate data
var results =
from x in items.AsParallel().WithDegreeOfParallelism(100)
where Predicate(x)
select ComputeSomeValue(x);
foreach (var result in results)
PerformSomeAction(result);
Этот запрос представляет собой всего лишь эскиз реального запроса. Теперь я хочу, чтобы каждая из функций-заполнителей была асинхронной (возвращает Task
и внутренне базируется на async IO).
Обратите внимание, что в памяти может быть гораздо больше предметов, чем может быть сохранено в памяти. Я также должен контролировать степень параллелизма, чтобы максимизировать базовую сеть и дисковое оборудование.
Этот вопрос не касается многоядерных процессоров. Он полностью применим к машинам с только одним ядром ЦП, поскольку IO все еще может выиграть от параллелизма. Подумайте о медленных вызовах веб-сервиса и тому подобных.
+1, отличный вопрос. Интересно, можете ли вы использовать порты завершения на стороне ввода-вывода для достижения параллелизма? Отказ от ответственности: я использовал их много на C++, но никогда не C#. –
Вы сказали, что «рабочие элементы не связаны с ЦП, а связаны с IO». Следовательно, большое количество ядер и параллелизм CPU не будут иметь слишком большой поддержки. Я имею в виду, что если использование ЦП низкое, а использование I/O является высоким для этих двух операций, тогда создайте n = 10 прикованных действий (ComputeSomeValue, продолжение по PerformSomeAction) и начните цепочку последовательно. * Новая задача (ComputeSomeValue) .ContinueWith (...) * и т. Д. –
Вы можете применить этот фильтр, который у вас есть с PLINQ (параллелизм процессора), но это все ... Вам нужно запускать задачи для части ввода-вывода. . ИМХО. –