名前

Mojo::IOLoop::Subprocess - サブプロセス

使い方

use Mojo::IOLoop::Subprocess;

# 5秒間イベントループをブロックする操作
my $subprocess = Mojo::IOLoop::Subprocess->new;
$subprocess->run(
  sub {
    my $subprocess = shift;
    sleep 5;
    return '♥', 'Mojolicious';
  },
  sub {
    my ($subprocess, $err, @results) = @_;
    say "Subprocess error: $err" and return if $err;
    say "I $results[0] $results[1]!";
  }
);

# 必要ならばイベントループを開始する
$subprocess->ioloop->start unless $subprocess->ioloop->is_running;

説明

Mojo::IOLoop::Subprocessは、イベントループをブロックすることなく、がサブプロセスで高負荷なオペレーションを実行できるようにします。

イベント

Mojo::IOLoop::SubprocessMojo::EventEmitterからすべてのイベントを継承しており、次の新しいイベントを発行します。

progress

$subprocess->on(progress => sub {
  my ($subprocess, @data) = @_;
  ...
});

サブプロセスが、progressメソッドを呼び出すと、親プロセスで発行されます。

spawn

$subprocess->on(spawn => sub {
  my $subprocess = shift;
  ...
});

サブプロセスが生成されたときに親プロセスで発行されます。

$subprocess->on(spawn => sub {
  my $subprocess = shift;
  my $pid = $subprocess->pid;
  say "Performing work in process $pid";
});

属性

Mojo::IOLoop::Subprocessは次の属性を実装しています。

deserialize

my $cb      = $subprocess->deserialize;
$subprocess = $subprocess->deserialize(sub {...});

サブプロセスの戻り値をデシリアライズするために使用されるコールバック。デフォルトはStorableを使用します。

$subprocess->deserialize(sub {
  my $bytes = shift;
  return [];
});

ioloop

my $loop    = $subprocess->ioloop;
$subprocess = $subprocess->ioloop(Mojo::IOLoop->new);

制御のためのイベントループオブジェクト。デフォルトはグローバルなMojo::IOLoopシングルトンです。 この属性は弱参照であることに注意してください。

serialize

my $cb      = $subprocess->serialize;
$subprocess = $subprocess->serialize(sub {...});

サブプロセスの戻り値をシリアライズするために使用されるコールバック。デフォルトはStorableを使用します。

$subprocess->serialize(sub {
  my $array = shift;
  return '';
});

メソッド

Mojo::IOLoop::SubprocessMojo::EventEmitterからすべてのメソッドを継承し、次の新しいメソッドを実装します。

pid

my $pid = $subprocess->pid;

利用可能ならば、生成されたサブプロセスのプロセスID。

progress

$subprocess->progress(@data);

Storableでシリアライズされたデータを、サブプロセスの実行中いつでも、親プロセスに送ります サブプロセスによって呼び出されなければならず、データを持つ親プロセスにおいて、"progress"イベントを発行します。

# 進捗情報を親プロセスに送信する
$subprocess->run(
  sub {
    my $subprocess = shift;
    $subprocess->progress('0%');
    sleep 5;
    $subprocess->progress('50%');
    sleep 5;
    return 'Hello Mojo!';
  },
  sub {
    my ($subprocess, $err, @results) = @_;
    say 'Progress is 100%';
    say $results[0];
  }
);
$subprocess->on(progress => sub {
  my ($subprocess, @data) = @_;
  say "Progress is $data[0]";
});

run

$subprocess = $subprocess->run(sub {...}, sub {...});

子プロセスで最初のコールバックを実行し、それが、ひとつか複数の値を返すまで待ちます。 親プロセスで"ioloopをブロックすることはありあせん。 それから一つ目の実行結果を使って、親プロセス内の2番目のコールバックを実行します。 最初のコールバックとそれによってスローされた例外は、Storableによってシリアライズされます。 ですので、プロセス間で共有できます。

SEE ALSO

Mojolicious, Mojolicious::Guides, https://mojolicious.org.

(Mojolicious 8.12。2019年5月22日更新)