subprocess.check_call
удобно, если вы не хотите проверять возвращаемые значения. Он генерирует исключение при любой ошибке.
Я нашел ответ (или, по крайней мере, и ответ). Это связано с разбиением на части. Ответ 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-часовым элементом. Таким образом, в этом случае издержки «по одному» того стоят.