Очередь форка Perl для процессора n-Core
Я пишу заявление, подобное тому, что было предложено здесь. По сути, я использую Perl для параллельного управления несколькими процессами, интенсивно использующими процессор, через fork и wait. Тем не менее, я работаю на 4-ядерном компьютере, и у меня есть еще много процессов, все с очень разным ожидаемым временем выполнения, которые априори не известны.
В конечном счете, потребовалось бы больше усилий для оценки времени выполнения и правильной группировки, чем для простого использования системы очередей для каждого ядра. В конечном итоге я хочу, чтобы каждое ядро обрабатывалось с минимальным временем простоя, пока все не будет сделано. Есть ли предпочтительный алгоритм или механизм для этого? Я бы предположил, что это распространенная проблема / использование, поэтому я не хочу заново изобретать колесо, поскольку мое колесо, вероятно, будет уступать "правильному пути". '
В качестве небольшого отступления я бы предпочел не импортировать дополнительные модули (например, Parallel:: ForkManager) для достижения этой цели, но если это лучший путь, я его рассмотрю.
~ Спасибо!
РЕДАКТИРОВАТЬ: Исправлена ссылка "здесь": благодаря ikegami
РЕДАКТИРОВАТЬ: P:: FM слишком прост в использовании, чтобы не... Сегодня я узнал.
1 ответ
Forks::Super
имеет некоторые функции, которые хороши для такого рода задач.
- расширенный синтаксис, но не много нового синтаксиса: если у вас уже есть программа с
fork
а такжеwait
звонки, вы все еще можете использовать функцииForks::Super
без особых изменений То есть ваш новый код все равно будет иметьfork
а такжеwait
звонки. - удушение работы: как
Parallel::ForkManager
, вы можете контролировать, сколько заданий вы выполняете одновременно. Когда одно задание завершено, модуль может запустить другое, полностью поддерживая вашу систему. Вы также можете указать более сложную логику, например: "запускать максимум 6 фоновых заданий по выходным или с полуночи до 6:00 утра, но 2 фоновых задания в остальное время". Сроки утилиты:
Forks::Super
отслеживает время начала и окончания каждой работы, позволяя вам регистрировать и анализировать, сколько времени заняла каждая работа:fork { cmd => "some command" }; ... $pid = wait; $elapsed = $pid->{end} - $pid->{start}; print LOG "That job took ${elapsed}s\n";
Контроль сродства процессора: я не могу сказать, нужно ли это вам, но Гуарав, казалось, думал, что это имеет значение. Вы можете назначить фоновые задания конкретным ядрам
# restrict job to cores #0 and #2 $job = fork { sub => \&background_process, args => \@args, cpu_affinity => 0x05 };