在Perl中执行多处理任务时出现的问题
我正在尝试做一个基本的多处理任务,这就是我所拥有的。首先,我不知道将这个程序作为一个非阻塞进程的正确方法,因为当我等待一个子进程的响应时(使用在Perl中执行多处理任务时出现的问题,perl,process,multiprocessing,Perl,Process,Multiprocessing,我正在尝试做一个基本的多处理任务,这就是我所拥有的。首先,我不知道将这个程序作为一个非阻塞进程的正确方法,因为当我等待一个子进程的响应时(使用waitpid),其他进程也必须在队列中等待,但是,如果一些子进程在之前死亡(我的意思是,进程无序死亡),会发生什么?所以,我一直在搜索,我发现我可以得到刚刚死亡的进程的PID,为此我使用waitpid(-1,WNOHANG)。我总是得到一个警告,WNOHANG不是一个数字,但是当我添加lib sys_wait_h时,我没有得到那个错误,但是脚本从不等待P
waitpid
),其他进程也必须在队列中等待,但是,如果一些子进程在之前死亡(我的意思是,进程无序死亡),会发生什么?所以,我一直在搜索,我发现我可以得到刚刚死亡的进程的PID,为此我使用waitpid(-1,WNOHANG)
。我总是得到一个警告,WNOHANG
不是一个数字,但是当我添加lib sys_wait_h时,我没有得到那个错误,但是脚本从不等待PID,可能是什么错误
#!/usr/bin/perl
#use POSIX ":sys_wait_h"; #if I use this library, I dont get the error, but it wont wait for the return of the child
use warnings;
main(@ARGV);
sub main{
my $num = 3;
for(1..$num){
my $pid = fork();
if ($pid) {
print "Im going to wait (Im the parent); my child is: $pid\n";
push(@childs, $pid);
}
elsif ($pid == 0) {
my $slp = 5 * $_;
print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds\n";
sleep $slp;
print "$_ : I finished my sleep\n";
exit(0);
}
else {
die "couldn’t fork: $!\n";
}
}
foreach (@childs) {
print "Im waiting for: $_\n";
my $ret = waitpid(-1, WNOHANG);
#waitpid($_, 0);
print "Ive just finish waiting for: $_; the return: $ret \n";
}
}
#!/usr/bin/perl
#使用POSIX“:sys_wait_h”#如果我使用这个库,我不会得到错误,但它不会等待孩子的返回
使用警告;
main(@ARGV);
副总管{
我的$num=3;
用于(1..$num){
我的$pid=fork();
如果($pid){
打印“我将等待(我是家长);我的孩子是:$pid\n”;
推送(@childs,$pid);
}
elsif($pid==0){
my$slp=5*$\;
打印“$\:我将执行我的代码(我是一个孩子),我将等待$slp秒\n”;
睡眠$slp;
打印“$\我已完成睡眠\n”;
出口(0);
}
否则{
die“无法分叉:$!\n”;
}
}
foreach(@childs){
打印“我正在等待:$\n”;
my$ret=waitpid(-1,WNOHANG);
#waitpid($0);
打印“我刚刚完成等待:$\u;返回:$ret\n”;
}
}
提前谢谢,再见 如果使用WNOHANG,如果没有子进程终止,则进程将不会阻塞。这就是WNOHANG的观点;它确保waitpid()将快速返回。在您的例子中,似乎只想使用wait()而不是waitpid() 我发现它能很好地处理所有这些事情。它是对各种事情的异步(非阻塞)控制,包括外部进程。你不必处理所有低级的东西,因为坡是为你做的