The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"FreeBSD 4.9, perl 5.8.6"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"FreeBSD 4.9, perl 5.8.6"
Сообщение от BigElectricCat Искать по авторуВ закладки(ok) on 31-Дек-04, 10:57  (MSK)
Существует некоторый мультипроцессорный скрипт на перле. Время выполнения единичной задачи 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 = ╛count;
                %param = ();
                tied(%param)->shunlock();
                # единичная задача
                ...
            } else {
                tied(%param)->shunlock();    
            }
        }
    }
}


while (!$exit) {
    unless (%param) {
        tied(%param)->shlock();
        %param = (p1 => 1, p2 => 2);
        tied(%param)->shunlock();
    }
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "FreeBSD 4.9, perl 5.8.6"
Сообщение от BigElectricCat Искать по авторуВ закладки(ok) on 31-Дек-04, 11:30  (MSK)
Сорри, по ошибке неправильно тему написал. Модераторы, исправьте, пожалуйста, на "Двунаправленное взаимодействие между родительским и дочерними процессами".
  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "FreeBSD 4.9, perl 5.8.6"
Сообщение от rWizard emailИскать по авторуВ закладки(ok) on 01-Янв-05, 18:18  (MSK)
а если отдельный pipe для связи с каждым процессом?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "FreeBSD 4.9, perl 5.8.6"
Сообщение от BigElectricCat Искать по авторуВ закладки(ok) on 01-Янв-05, 22:16  (MSK)
>а если отдельный pipe для связи с каждым процессом?

Имеется в виду двунаправленный канал? С ними не очень-то удобно работать..

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру