Очередь форка 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 };
    
Другие вопросы по тегам