我想在后台运行一个子例程,并在程序中返回其值。所以我做的是
use Proc::Simple;
$myproc = Proc::Simple->new(); # Create a new process object
$myproc->start(&subroutine); # Launch a perl subroutine
但是我的子程序返回了一个值。我第一次尝试使用全局变量,但没有成功。
有人知道我如何从bg过程中返回值吗?
查看Proc::Simple的代码,返回值被丢弃。start()方法只返回0或1,具体取决于fork是否成功。
我想你需要使用某种形式的IPC来获得返回值。
有人知道我如何从bg进程返回值吗
如果没有某种形式的进程间通信,进程通常只将其退出状态传递给父进程。CCD_ 1通过CCD_。
然而,您的子例程可能会返回一个简单数字以外的东西,在这种情况下,您需要设计某种IPC,或者将异步处理作为线程移回主程序。
Forks::Super
中的bg_eval
方法解决了这个问题,为您处理所有IPC。
use Forks::Super;
my $value = bg_eval &subroutine;
在后台运行函数subroutine
,并返回一个绑定标量(或绑定数组,如果在列表上下文中调用)。下一次引用$value
时,父进程将在后台进程中检索子例程调用的返回值,并在必要时等待它完成。
... do something else ...
push @other_vals, $value; # return val from bg proc, waiting if nec.
我认为最简单的方法是使用线程。我可以在线程中运行子例程,并使用join()来使用它的返回值。