Pergunta

Ryan Tomayko desencadeou um grande tempestade de fogo com este post sobre o uso de controle de processos Unix comandos.

Devemos fazer mais disso. Muito mais disto. Estou falando de fork (2), execve (2), tubo (2), socketpair (2), selecione (2), kill (2), sigaction (2), e assim por diante e assim por diante. Estes são nossos amigos. Eles querem tão mal apenas para nos ajudar.

Eu tenho um pouco de código (um clone delayed_job para DataMapper que eu acho que se encaixaria bem com isso, mas eu não estou claro sobre como tirar proveito dos comandos listados. Todas as ideias sobre como melhorar esse código?

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
Foi útil?

Solução

Ahh sim ... os perigos da "Devemos fazer mais desta" sem explicar o que cada um deles fazer e em que circunstâncias você usá-los. Para algo como delayed_job você pode até estar usando fork sem saber que você está usando fork. Dito isto, realmente não importa. Ryan estava falando sobre o uso fork para preforking servidores. delayed_job usaria fork para transformar um processo em um daemon. chamada de sistema mesmo, diferentes fins. Correndo delayed_job em primeiro plano (sem fork) vs no fundo (com fork) irá resultar em uma diferença de desempenho insignificante.

No entanto, se você escrever um servidor que aceita conexões simultâneas, agora o conselho de Ryan está certo sobre o dinheiro.

  • fork: cria uma cópia do processo original
  • execve: pára de executar o arquivo atual e começa a executar um novo arquivo no mesmo processo (muito útil em tarefas rake)
  • pipe: cria um pipe (dois descritores de arquivos, um para leitura, uma para escrever)
  • socketpair: como um tubo, mas para soquetes
  • select: Vamos você esperar por um ou mais dos vários descritores de arquivos para estar pronto com um tempo limite
  • kill: utilizado para enviar um sinal para um processo
  • sigaction: permite alterar o que acontece quando um processo recebe um sinal

Outras dicas

5 meses mais tarde, você pode ver a minha solução em http://github.com/antarestrader/Updater. Olhe para lib / updater / fork_worker.rb

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top