|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : yurik shestakov 2:5020/400 14 Aug 2004 10:49:49 To : abrasha shapirus Subject : Re: ограничить количество работающих копий скрипта -------------------------------------------------------------------------------- On Fri, Aug 13, 2004 at 07:41:02PM +0400, abrasha shapirus wrote: as> нужно сие для ограничения количества одновременно работающих as> CGI-скриптов на не слишком мощной машине. as> как такое реализовать попроще и покрасивее? можно где-то так, как приведено ниже. В качестве аргумента передается файл со списоком URL-ей, к-е нужно вытянуть. И задается максимально количество паралельно работающих экземпляров wget. ======================================================================== #!/usr/bin/perl -w use strict; use POSIX ":sys_wait_h"; use FileHandle; use Getopt::Std; my %opt = (); getopts('F:c:',\%opt); my $max_forks = $opt{'F'} || 100; my $max_childs = $opt{'c'} || 5; my $file_list = shift @ARGV; die "Usage: $0 url_list_filename\n" unless $file_list && -f $file_list; open (IN, '<'.$file_list) or die "open $file_list: $!"; my @url_list = (); while (<IN>) { chomp; push @url_list, $_; } close IN; autoflush STDOUT 1; my $childs_in_process = 0; my %wait_it = (); my $fork_cnt = 0; LOOP: while (scalar @url_list && $fork_cnt < $max_forks) { if ( $childs_in_process <= $max_childs) { # fork new child; my $url = shift @url_list; my $pid = fork(); if ($pid) { $wait_it{$pid} = $url; ++$childs_in_process; ++$fork_cnt; print "($childs_in_process/$fork_cnt) Retrive $url\n"; next LOOP; } die "fork: $!" unless defined $pid; exec 'wget','-q','-c', $url; # exit here } else { # check for childs is running foreach my $pid (keys %wait_it) { print "Wait pid=$pid (WNOHANG)..."; my $rc = POSIX::waitpid($pid, &WNOHANG); print " rc=$rc" , $rc == 0 ? "\r" : " fork_cnt=$fork_cnt\n"; if ($rc > 0) { # process exited delete $wait_it{$pid}; --$childs_in_process; } elsif ($rc == -1) { print STDERR "waitpid($pid) error: $!\n"; } } } sleep 2; } print "Loop done. childs_in_process=$childs_in_process\n"; # ждать завершения всех остальных foreach my $pid (keys %wait_it) { print "Wait pid=$pid: $wait_it{$pid}\n"; my $rc = POSIX::waitpid($pid, 0); if ($rc > 0) { # process exited delete $wait_it{$pid}; --$childs_in_process; } elsif ($rc == -1) { print STDERR "waitpid($pid) error: $!\n"; } } exit 0; ======================================================================== -- // yurik shestakov --- ifmail v.2.15dev5.3 * Origin: Unknown (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/10069b11a4845.html, оценка из 5, голосов 10
|