Каков рекомендуемый механизм распараллеливания деревьев экспрессии? - PullRequest
1 голос
/ 01 августа 2011

учитывая сценарий, в котором я сериализую и десериализирую деревья выражений, которые работают на IEnumerable s для масштабирования распределенной обработки, я хотел бы также автоматизировать масштабирование: при выполнении этого дерева выражений я хотел бы применить TPLОператор AsParallel ().

Как лучше всего это делать?

1 Ответ

0 голосов
/ 15 августа 2011

Не уверен, где твоя проблема.Я предполагаю, что вы хотите

IEnumerable<string> enumerable = new List<string>();
Expression<Func<IEnumerable<string>, IEnumerable<bool>>> expression = a => a.Select(b => b == true);

Для автоматического увеличения и уменьшения.Дело в том, что AsParallel () просто возвращает класс, который реализует другой метод GetEnumerator ().Он по-прежнему работает через интерфейс IEnumerable .Так почему бы вам не реализовать

Expression<Func<ParallelQuery<TSource>, IEnumerable<bool>>> expression = a => a.Select(b => b == true);

по умолчанию?Тогда есть что-то вроде:

void Execute(Expression<Func<ParallelQuery<string>, IEnumerable<bool>>> expression, IEnumerable<string> strings)
{
    ParallelQuery<string> parStrings;
    if (!typeof (ParallelQuery<string>).IsAssignableFrom(strings.GetType()))
        parStrings = strings as ParallelQuery<string>;
    else
        parStrings = strings.AsParallel();

    expression.Compile()(parStrings);
}

Короче говоря.Пусть ваше выражение работает по умолчанию с ParallelQuery и преобразует ваш IEnumerable в ParallelQuery .В противном случае вы смотрите на обход узла / перекомпоновку запроса.(Не уверен, что это ответит на ваш вопрос. Но в любом случае на болтовню.)

Просто предупреждение с предупреждением Expression.Compile () - очень тяжелый метод.Если вам нужна производительность, по возможности избегайте ее.

...