Ryan Tomayko氏は、Unixプロセス制御コマンドの使用に関して、かなりの火災の嵐をthis postで打ちました。RubyでのUnixプロセス制御メソッドの使用
さらにこれを行う必要があります。これ以上のこと。私はfork(2)、execve(2)、pipe(2)、socketpair(2)、select(2)、kill(2)、sigaction(2)などについて話しています。これらは私たちの友達です。彼らは私たちを助けるためにひどく欲しい。
私は、コードのビット(私はこれに右収まると思うDataMapperのためdelayed_job
クローンを持っているが、私は記載されているコマンドを利用する方法については明確ではないんだ。改善する方法上の任意のアイデアこのコードは?
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self)
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
end
代わりに(緑色の)スレッドを作成する代わりに、代わりにfork(2)を使用してPIDバックを使うことができます。これほど多くは私がやったことです。新しいジョブがキューにヒットしたときにスレッドを起動するトラップ( 'USR1')のブロックをどのように使用すればよいですか?どのようにして1つ以上のプロセスを作成し、それらを最適にキューから取り出すことができるのでしょうか。魔法はパイプに入っているように見えますが、私はその複雑さを理解していません。私はデーモンの宝石を使って、フードの下でフォークを使うデーモンプロセスを作ることができます。キューを実行するためにいくつかの子プロセスを開始したい。 –
この文脈で「仕事」とは何かを意味します。 「仕事」がI/Oの場合、それは異なる可能性がありますし、「選択」が重要です。私は、作業を任意の順序で実行できるように作業キューを設計する方が好きです。したがって、ワークユニット#1がワークユニット#2と並行して実行される場合、それは問題ではありません。デーモンの宝石については、私は以前使っていましたが、今は 'fork'を直接使うか、ChainGangライブラリを使います。私はデーモンがあまりにも多くの重要な情報を隠していたことを発見しました。 ChainGangは非常にアルファの品質です。 –
本質的に、「キューを最適に引き出す」ことを心配することは、ほとんどのコンテキストでは大いに意味をなさない。あなたがI/Oを使って作業している場合は、おそらく 'delayed_job'キューを使用していないか、個別の作業単位として実行しています。その場合、' select'と 'pipe'は何もしませんセンス。いずれにしても、作業キューを処理する正しい方法は、自由になるたびに上にあるものをつかむことです。そして、そこに何もなければ、それがあるまでブロックするだけで大丈夫です。 –