10

Ryan Tomaykoは、Unixプロセス制御コマンドの使用に関するこの投稿でかなりの大火事に触れました。

これをもっとやるべきです。これの多く。私はfork(2)、execve(2)、pipe(2)、socketpair(2)、select(2)、kill(2)、sigaction(2)などについて話しています。これらは私たちの友達です。彼らは私たちを助けるためだけにひどく望んでいます。

私は少しコードを持っています(delayed_jobこれにぴったり合うと思うDataMapperのクローンですが、リストされたコマンドを利用する方法がわかりません。このコードを改善する方法について何かアイデアはありますか?

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
4

2 に答える 2

3

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

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

  • fork:元のプロセスのコピーを作成します
  • execve:現在のファイルの実行を停止し、同じプロセスで新しいファイルの実行を開始します(rakeタスクで非常に役立ちます)
  • pipe:パイプを作成します(2つのファイル記述子、1つは読み取り用、もう1つは書き込み用)
  • socketpair:パイプのようですが、ソケット用です
  • select:1つ以上の複数のファイル記述子がタイムアウトで準備ができるのを待ちましょう
  • kill:プロセスにシグナルを送信するために使用されます
  • sigaction:プロセスがシグナルを受信したときに何が起こるかを変更できます
于 2009-10-22T22:27:27.960 に答える
1

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

于 2010-03-28T01:22:05.207 に答える