C # Parallel.ForEach заблокирован на длинной итерации

subprocess.check_call удобно, если вы не хотите проверять возвращаемые значения. Он генерирует исключение при любой ошибке.

0
задан Troy Berg 4 March 2019 в 16:55
поделиться

1 ответ

Я нашел ответ (или, по крайней мере, и ответ). Это связано с разбиением на части. Ответ SO здесь получил его для меня. Таким образом, в основном, в верхней части моей функции «Процесс», если я перейду от этого:

        static void Process(int[] items)
        {
            Parallel.ForEach(items, (msToWait) => { ... });
        }

к этому

        static void Process(int[] items)
        {
            var partitioner = Partitioner.Create(items, EnumerablePartitionerOptions.NoBuffering);
            Parallel.ForEach(partitioner, (msToWait) => { ... });
        }

, то он захватывает работу по одному. Для более типичного случая параллели для каждого, когда тело не занимает больше секунды, я, конечно, могу видеть разбивку на части работы. В моем случае, однако, каждая часть тела может занять от полсекунды до 5 часов. Я, конечно, не хотел бы, чтобы группа из 10-секундных элементов разнообразия была заблокирована одним 5-часовым элементом. Таким образом, в этом случае издержки «по одному» того стоят.

0
ответ дан Troy Berg 4 March 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: