Cуществует некоторый мультипроцессорный скрипт на перле. Время выполнения единичной задачи 1-4 секунды (head запрос, практически все время процесс простаивает, ожидая ответа от удаленного сервера). Необходимо выполнять 20-30 задач в секунду, поэтому приходится создавать 100 процессов. Схема, когда один дочерний процесс выполняет одну задачу и завершается, а родительский процесс устанавливает параметры и создает новые процессы не подходит - система не очень радостно реагирует на 30 форков в секунду. Посему было решено использовать метод предварительного ветвления. Нагрузка на систему колоссально уменьшилась, однако возникла новая проблема. С обычным форком входящие параметры для дочернего процесса устанавливались непосредственно перед ветвлением, а для возврата результатов в родительский процесс использовался однонаправленный канал. С префорком каждый дочерний процесс выполняет задачи в цикле. Для возврата результатов в родительский процесс можно использовать все тот же однонаправленный канал, но в то же время, необходимо каким-то образом передавать дочернему параметры из родителя. 
Моя реализация (значимые части кода привожу нижу) - первое, что пришло в голову. Все работает, но нагрузка на систему еще больше по сравнению с той, которая была с обычным форком. Это, в принципе, неудивительно т.к. ежесекундно приходит 40-60 локов и анлоков и записей в шаровую переменную. 
Возможно, существуют более правильные способы решения подобной задачи (двунаправленной связи между родительским и дочерними процессами)? Буду благодарен за любой совет. 
tie (%PARAM, \'IPC::Shareable\', \'PARAM\', { create => 1, exclusive => 1, destroy => 1 }); 
for (1..$max_process) { 
    if (fork() == 0) { 
        my %param; 
        tie(%param, \'IPC::Shareable\', \'PARAM\'); 
         
        while (!$exit) { 
             
            # "гонка" за новыми параметрами 
            tied(%param)->shlock(); 
            # если успели - забираем параметры 
            if (%param) { 
                my %local_param = %param; 
                %param = (); 
                tied(%param)->shunlock(); 
                # единичная задача 
                ... 
            } else { 
                tied(%param)->shunlock();     
            } 
        } 
    } 
} 
while (!$exit) { 
    unless (%param) { 
        tied(%param)->shlock(); 
        %param = (p1 => 1, p2 => 2); 
        tied(%param)->shunlock(); 
    } 
}