Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中执行多处理任务时出现的问题_Perl_Process_Multiprocessing - Fatal编程技术网

在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()

我发现它能很好地处理所有这些事情。它是对各种事情的异步(非阻塞)控制,包括外部进程。你不必处理所有低级的东西,因为坡是为你做的