Perl模块能够在后台运行进程,对其进行监视并返回一些数据

时间:2019-06-27 10:04:21

标签: perl fork monitor

我在这里的要求是能够在后台运行进程并监视该进程,以便调用者可以检查它的状态,指定超时并通过某个对象(而不是通过某个文件)读取该进程返回的数据。

我探索了以下模块:

  • Proc::Reliable-它能够监视进程并重试失败,但会阻止调用进程(它不会将控制权交还给调用者)

  • Proc::Simple-它能够在后台触发该进程,并控制调用方并传递其状态。但是我没有看到使进程返回一些数据对象的选项

Cpan模块的任何指针都可以完成此工作。

1 个答案:

答案 0 :(得分:0)

IO::Async::Function将允许您在另一个进程中运行一个函数,并在内部将返回值序列化回父级。它返回一个Future来代表待处理的结果,并且该子流程由IO::Async::Loop事件循环管理。您可以自己运行循环(最常见的情况是您想与其他任务并行等待结果),也可以在Future上使用get方法来阻塞并运行循环,直到获得结果为止。

use strict;
use warnings;
use IO::Async::Function;
use IO::Async::Loop;

my $loop = IO::Async::Loop->new;
my $function = IO::Async::Function->new(code => sub {
  return {stuff => some_calculation(@_)};
});
$loop->add($function);

my $f = $function->call(args => [1..5]);

my $hashref = $f->get;

在此设计中要记住的重要一点是,事件循环是协作式多任务处理,而不是并行执行(这是子流程的目的)。他们一次要等待很多事情,但是一次只能运行一件事,并在运行时阻止该过程-没有魔术可以跳来跳去。因此,必须将它们与旨在阻止IO :: Async :: Function之类的功能或返回Future或promise或进行回调的其他API一起使用。

目前Future::AsyncAwait处于试验阶段,提供了其他一些语言正在采用的更多“魔术跳跃”功能,并且学习起来可能更自然...