Front page | perl.beginners |
Postings from March 2003
Re: Fork ?
Thread Previous
|
Thread Next
From:
Mark G
Date:
March 19, 2003 13:24
Subject:
Re: Fork ?
Message ID:
001b01c2ee5d$ddd813d0$13d2bf18@tanya
Ok I wrote you a quick example jeroe. I only had time to test it on a Xp
box, this should work on *nix as well since most of my coding is on *nix.
What you are looking for is a set of exec and waitpid call's to do the trick
for you. Basicly this is how its usually don with forking.
a: parents forks
b: child exec's
c: parent keeps track of childs
You might wanna expiriment with threads. It would not only give you beter
control, more flexibility, but also faster perforamce.
-->>> CUT
use POSIX ":sys_wait_h";
my $CHILD_SPAWNED=0;
my $CHILD_TO_CREATE=20;
my $MAX_CHILD=3;
$|=1;
while( $CHILD_SPAWNED < $CHILD_TO_CREATE ){
print "-------\t\t RUNING $CHILD_CREATED------------\n";
if( $CHILD_CREATED < $MAX_CHILD ){
die "couldnt not spawn: $!" unless defined ( my $PID=fork() );
$CHILD_CREATED++;
$CHILD_SPAWNED++;
unless( $PID ){
$|=1;
print "I am child $$...about to exec\n";
{ exec ('c:\perl\count.pl') }; print STDERR "could not exec: $!";
}
}
# child never get's here
$status=waitpid(-1,WNOHANG);
if( $status != 0 ){ #some child has exited
$CHILD_CREATED--;
print "child $status has exited \n";
}
}
print "TOTAL CHILD SPAWNED IS $CHILD_SPAWNED\n";
<<<<<--------- PASTE
->>>>> CUT
#c:\perl\count.pl
while($i<100000){$i++};
print $i;
<<<------ PASTE
----- Original Message -----
From: "Jeroen Lodewijks" <wcool@myrealbox.com>
To: <beginners@perl.org>
Sent: Wednesday, March 19, 2003 3:03 PM
Subject: Fork ?
> Hi all,
>
> Not sure if this appropriate for the beginners list but there is no
> intermediate list :)
>
> I am writing a program in Perl to 'move' output from one process.
> The program looks in a database which contains lists of files.
>
> These files are either FTP'ed to mailed to recipients.
>
> I actually made this program using modules Mime::Lite and Net::FTP
> No sweat really.
>
> But when I FTP or mail, the program waits, so I want to make it multi
> process.
> And there is my problem. I tried fork() but it doesn't do what I want or I
> got it wrong.
> (maybe it's not the appropriate thing to use anyway)
>
> So my question is: how to start multi processing?
>
> Just imagine I have 'datapump', I gathered all data required to send it.
> What I want now is that a separate process is started to send the file
> (either by FTP or mail).
> The data pump continues and spawns up to 10 processes, if more it will
wait.
>
> Here is what I thought would work: (try program)
>
> #!/bin/env perl
>
> use strict;
>
> my $ADD = 0;
> my $WAIT = 1;
>
> {
> my $state = $ADD;
> my $processes = 1;
>
> sub ProcessHandler
> {
> my $request = @_;
>
> print "REQUEST = $request STATE = $state PRC =
> $processes\n";
>
> if ($state == $ADD) {
> my $pid = fork();
> die "Cannot fork: $!" unless defined($pid);
> if ($pid == 0) {
> # Child process
> $processes++;
> if ($state > 10) {
> $state = $WAIT;
> }
> sleep (int(rand 20) + 1);
> print "child proc added PRC = $processes\n";
> }
> else {
> print "MAIN process PRC $processes\n";
> }
> }
> elsif ($state == $WAIT) {
> print "WAIT\n";
> wait;
> $state = $ADD;
> $processes--;
> print "child proc removed PRC = $processes\n";
> }
> }
> }
>
> my $i;
> for ($i = 0;; $i < 20; $i++) {
> print "HI! $i\n";
> ProcessHandler($i);
> };
>
>
> It doesn't do what I want at all. It spawns way too many processes.
> (and I get errors in win 2000).
>
> Basically, I want to spawn a process which does something (call a
> subroutine)
> The main process should just continue pumping data which is spawned up to
10
> processes.
> Else it should wait until 1 of the 10 processes finishes.
>
> Any code examples out there??
>
> PS The target machine is a Unix box.
>
> Thanx,
>
> Jeroen
>
>
> --
> To unsubscribe, e-mail: beginners-unsubscribe@perl.org
> For additional commands, e-mail: beginners-help@perl.org
>
Thread Previous
|
Thread Next