0

アクターをブロックせずにサブプロセスを生成する最良の方法は何ですか?

私の目標は、複数のコマンドを実行し、それらが完了したら、出力と終了コードを取得することです。私はこれを試しましたが、明らかに、 popen 呼び出しがブロックされています:

#!/usr/bin/env ruby

require 'celluloid/current'
require 'celluloid/io'

class MyProcessLauncher
    include Celluloid::IO

    def run
        every(1) { puts "tick" }

        every(5) {
            puts "Starting subprocess"
            ::IO.popen("sleep 10 && echo 'subprocess done'", :err=>[:child, :out]) { |io|
                puts io.read
            }
            puts $?.exitstatus
        }
    end
end

MyProcessLauncher.new.run
sleep

出力は次のとおりです。

tick
tick
tick
tick
Starting subprocess
subprocess done
0
tick
Starting subprocess

しかし、各「サブプロセスの開始」の間に5つの「ティック」が必要です...

ありがとう !

4

1 に答える 1

2

戻り値が必要な場合は、 a をdefer使用する必要があります。future

defer(返品不要なら簡単)

every(5)ブロック内で を使用するには、呼び出し (終了ステータス表示呼び出しを含む) を次のようdeferにラップします。popendefer {}

future(もう少し複雑です)

このアプローチを実装するには、いくつかの方法があります。私の提案は、の内容をevery(5)独自のメソッドに移動し、@futures起動時に配列などを初期化してから、呼び出しMyProcessLauncher内でこれを使用することです。every(5)

@futures = future.new_method

また、先物を処理する新しいループを追加します。新しいハンドラ (別のループ、または再帰的なプロセッサ メソッドの呼び出し) をevery(5)追加して値を処理した後、基本的にこれを行います。everyasync

value = @futures.pop.value if @futures.any?

問題があり、先物を処理する方法の例が見つからない場合は、先物についてフォローアップの質問をします. それ以外の場合は、popenブロックせずに呼び出しを処理する方法が 2 つあります。

于 2016-02-08T23:34:14.180 に答える