Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите по fork 
:(
    Опции темы
DooZ
Дата 25.1.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



есть скрипт:
Код

#!/usr/bin/perl -w

use strict;
use POSIX ":sys_wait_h";

my $forks=0;
my $maxforks=5;
my @array;

    for (1..100)
    {
    push(@array, $_);
    }

print "Total: ".scalar(@array)."\n";
#####################################################
    while(1)
    {
        if($forks<$maxforks)
        {
        $forks++;

        my $c=pop(@array);
        last if not defined $c;

            if(!fork())
            {
            proccess($c);
            exit;
            }
        }

        while(1)
        {
        my $status=waitpid(-1,&WNOHANG);
        $forks-- if $status>0;
        last if $status<=0;
        }
    }

while(waitpid(-1,&WNOHANG)!=-1) { sleep(1); $forks--; }
#####################################################







#####################################################
#####################################################
sub proccess
{

my $i=shift;

print "proccess: $i\n";
sleep rand(int 3 + rand 10);

}
#####################################################
#####################################################


суть в следующем
все прекрастно работает, НО родительский процесс висит по комманде top со 100% нагрузкой на процессор
я понимаю что вот в этом куске все дело:
while(1)
{
my $status=waitpid(-1,&WNOHANG);
$forks-- if $status>0;
last if $status<=0;
}

т.е. он грузит НО! если поставить например sleep(1) теряется скорость, т.е. процессы порождаются каждую секунду это не верно и долго!

помогите как быть?

заранее сенькс

Это сообщение отредактировал(а) DooZ - 25.1.2007, 17:27
PM MAIL   Вверх
DooZ
Дата 26.1.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



неужели никто не сталкивался с такой проблемой?
может предложите иной способ юзания форка что бы не было нагрузки от родительского процесса?
PM MAIL   Вверх
Ivan Kolesnikov
Дата 29.1.2007, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



DooZ, я делал следующим образом: имеется PIPE в который дочернии потоки могут писать, а основной может читать. При этом дочерний поток при своем завершении записывает в PIPE какую-нибудь строку (например свой PID, но в принципе в данном случае это не важно). Основной поток с цикле создает максимальное число потоков, а после этого начинает читать из PIPE, как только он прочитал очередную строку значит один из потоков завершился, и можно создать еще один. Так делаем до тех пор пока есть данные для обработки после того как их не стало надо дождаться завершения работы дочерних потоков для этого мы делаем цикл по числу созданных потоков (их число в данный момент равно максимальному) и на каждой итерации читаем из PIPE очередную строку.

В общем вот так, почитать про PIPE и вообще про межпроцессорное взаимодейсвие можно так: perl perlipc

Если не понятно, то распишу поподробнее...
--------------------
PM MAIL ICQ   Вверх
DooZ
Дата 29.1.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



сенькс за ответ
но я решил все этим модулем: Parallel::ForkManager
очень удобная вещь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1007 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.