1

私はresqueを使用しており、その実行の一部としてシェルプロセスを開始するキュープロセッサを使用しています。現在、私はPTY.spawn()シェルコマンドを呼び出してその出力を処理するために使用しています。

このコードを拡張して、数量(N)を指定できるようにし(コマンドはVMで実行され、1回の呼び出しで変数番号を開始できるようにしたい)、シェルプロセスをN回呼び出すようにします。 N番目の呼び出しが呼び出しN-1の終了を待たずに、プロセスを分離します。また、各呼び出しからすべてのSTDOUTをキャプチャして、呼び出しが完了したら出力で作業できるようにします。

私は見てきましたKernel::forkが、フォークされたブロック内のコードの範囲はその親と同じではありません(かなり明白な理由で)。

各プロセスを個別に生成し、それらの出力をキャプチャし、親プロセスにすべてのプロセスが終了するのを待ってから次に進むことができるように、どのツールを使用できますか?

4

1 に答える 1

1

ここ:

stdouts=[]
numberOfProcesses.times do 
  stdouts<<PTY.spawn(command_line)[0..-1]
end

それらをスポーンしてSTDOUT/STDINペアの束を取得する場合、これはかなり基本的なことです。完了したらすぐに各プロセスの出力を処理できるようにする場合は、次のことを試してください。

threads=[]
numberOfProcesses.times do
  threads<<Thread.new(command_line) |cmd|
    stdout, stdin, pid = PTY.spawn(cmd)
    Process.waitpid(pid)
    process_output(stdout.read)
  end
end
threads.each {|t| t.join}

これにより、それらが並行して生成され、各スレッドはインスタンスが完了するのを待機します。インスタンスが完了すると、出力を処理して戻ります。メインスレッドは、他のすべてのスレッドが終了するのを待っています。

于 2012-07-17T18:18:04.127 に答える