开发者

In Perl, how can I block for a bunch of system calls to finish?

开发者 https://www.devze.com 2022-12-19 12:30 出处:网络
I\'m doing a bunch of system calls that I want to run in parallel: system(\" sleep 5 && echo step 1 done &\");

I'm doing a bunch of system calls that I want to run in parallel:

system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");

// block here

How can I block the program flow until all the system call开发者_如何学JAVAs are finished?


The easiest way to do this is probably to fork a new child process for each system call, and then wait for them to finish. Here's a simplified example:

my @commands = ( "sleep 5 && echo step 1 done",
                 "sleep 3 && echo step 2 done",
                 "sleep 7 && echo step 3 done" );

my @pids;
foreach my $cmd( @commands ) {
    my $pid = fork;
    if ( $pid ) {
        # parent process
        push @pids, $pid;
        next;
    }

    # now we're in the child
    system( $cmd );
    exit;            # terminate the child
}

wait for @pids;   # wait for each child to terminate

print "all done.\n";


Fork a child process to perform each job, and in the parent, wait for those processes to finish before exiting.

See perldoc perlfork, perldoc -f fork and perldoc -f waitpid.

(The exact code for this is left as an exercise for the reader -- everyone should have to write this from scratch at least once, to understand the details involved. There are lots of examples on this site as well.)


what about running each one of the system call from a different thread and join on the threads

0

精彩评论

暂无评论...
验证码 换一张
取 消