2009-10-22 6 views
10

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 

答えて

3

ああそう...それらのそれぞれが、どのような状況であなたがそれらを使用したい何をすべきかを説明せずに「私たちは、このの多くを行う必要があります」。delayed_jobのようなものについての危険性は、あなたさえかもしれませんあなたがforkを使用していることを知らずにforkを使用していても、それは本当に問題ではありません。Ryanは使用について話していましたプリフォークサーバー用の。 delayed_jobは、プロセスをデーモンに変換するためにforkを使用します。同じシステムコール、異なる目的。 (forkなし)をバックグラウンド(fork)で実行すると、パフォーマンスの差はごくわずかです。

ただし、同時接続を許可するサーバーを作成すると、Ryanのアドバイスがすぐにお金になります。

  • fork:元プロセス
  • execveのコピーを作成します:
  • pipe(すくいタスクにおいて非常に有用で)現在のファイルを実行すると、同じプロセスで新しいファイルの実行を開始します停止する:パイプを作成します(2つのファイルディスクリプタ、読み取り用、書き込み用1)
  • socketpair:パイプのような、しかし、ソケット
  • select用:複数のファイルディスクリプタの1つ以上が読み取られるようにするために、あなたが待ってみましょうプロセス
  • sigactionに信号を送信するために使用:タイムアウト
  • killとyのあなたは、プロセスがシグナルを受信したとき
+0

代わりに(緑色の)スレッドを作成する代わりに、代わりにfork(2)を使用してPIDバックを使うことができます。これほど多くは私がやったことです。新しいジョブがキューにヒットしたときにスレッドを起動するトラップ( 'USR1')のブロックをどのように使用すればよいですか?どのようにして1つ以上のプロセスを作成し、それらを最適にキューから取り出すことができるのでしょうか。魔法はパイプに入っているように見えますが、私はその複雑さを理解していません。私はデーモンの宝石を使って、フードの下でフォークを使うデーモンプロセスを作ることができます。キューを実行するためにいくつかの子プロセスを開始したい。 –

+0

この文脈で「仕事」とは何かを意味します。 「仕事」がI/Oの場合、それは異なる可能性がありますし、「選択」が重要です。私は、作業を任意の順序で実行できるように作業キューを設計する方が好きです。したがって、ワークユニット#1がワークユニット#2と並行して実行される場合、それは問題ではありません。デーモンの宝石については、私は以前使っていましたが、今は 'fork'を直接使うか、ChainGangライブラリを使います。私はデーモンがあまりにも多くの重要な情報を隠していたことを発見しました。 ChainGangは非常にアルファの品質です。 –

+0

本質的に、「キューを最適に引き出す」ことを心配することは、ほとんどのコンテキストでは大いに意味をなさない。あなたがI/Oを使って作業している場合は、おそらく 'delayed_job'キューを使用していないか、個別の作業単位として実行しています。その場合、' select'と 'pipe'は何もしませんセンス。いずれにしても、作業キューを処理する正しい方法は、自由になるたびに上にあるものをつかむことです。そして、そこに何もなければ、それがあるまでブロックするだけで大​​丈夫です。 –

1

5ヶ月後、あなたはhttp://github.com/antarestrader/Updaterで私の解決策を表示することができ、何が起こるか変更することができます。 lib/updater/fork_worker.rbを見てください。

関連する問題