【问题标题】:Perl Proc::Simple returning the value for the background subroutinePerl Proc::Simple 返回后台子例程的值
【发布时间】:2012-03-27 20:00:07
【问题描述】:

我想在后台运行一个子程序并在我的程序中返回它的值。 所以我要做的是

 use Proc::Simple;
 $myproc = Proc::Simple->new();        # Create a new process object
 $myproc->start(\&subroutine);         # Launch a perl subroutine

但是我的子程序返回一个值。我第一次尝试使用全局变量,但没有成功。

有人知道我如何从 bg 进程返回值吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    查看 Proc::Simple 的代码,返回值被丢弃。 start() 方法只返回 0 或 1,具体取决于 fork 是否成功。

    我猜你需要使用某种形式的IPC 来获取返回值。

    【讨论】:

    • 你可以在这里做的一种方式:perldoc.perl.org/…
    • 我可以像 $myproc->start(\&subroutine,$param,...);我可以通过引用传递返回参数(如 C/C++)吗?对不起,我在 Perl 中不是那么好。返回值是一个整数。
    • 这不起作用,因为 Proc::Simple 将在不同的进程中启动子。
    【解决方案2】:

    有人知道我如何从 bg 进程返回值吗?

    如果没有某种形式的进程间通信,进程通常只会将它们的退出状态传达给父进程。 Proc::Simple 通过exit_status() 方法公开了这一点。

    但是,您的子例程可能会返回一些不是简单数字的东西,例如,在这种情况下,您需要设计某种 IPC 或将异步处理作为线程移回主程序。

    【讨论】:

      【解决方案3】:

      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.
      

      【讨论】:

      • 有 Ubuntu 标准包吗?我安装了 libforks-perl,但它似乎没有那个 Super.pm。
      • 不,您从 CPAN 获得。在 Ubuntu cpan Forks::Super(或者最坏的情况下,sudo cpan Forks::Super)上应该安装它。
      【解决方案4】:

      我相信最简单的方法是使用线程。我可以在线程中运行子程序并使用 join() 来使用它的返回值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 2013-11-20
        • 2015-01-19
        • 1970-01-01
        • 2014-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多