質問

Ryan Tomaykoは、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
役に立ちましたか?

解決

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

ただし、同時接続を受け入れるサーバーを作成する場合、Ryanのアドバイスは適切です。

  • fork :元のプロセスのコピーを作成します
  • execve :現在のファイルの実行を停止し、同じプロセスで新しいファイルの実行を開始します(rakeタスクで非常に便利です)
  • pipe :パイプ(2つのファイル記述子、1つは読み取り用、1つは書き込み用)を作成します
  • socketpair :パイプに似ていますが、ソケット用です
  • select :複数のファイル記述子の1つ以上がタイムアウトになるまで待機します
  • kill :プロセスにシグナルを送信するために使用
  • sigaction :プロセスがシグナルを受信したときの動作を変更できます

他のヒント

5か月後、 http://github.com/antarestrader/Updaterでソリューションを表示できます。 lib / updater / fork_worker.rbを見てください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top