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::SubprocessはMojo::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::SubprocessはMojo::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日更新)