Question

Ryan Tomayko a lancé une cette publication sur l'utilisation du contrôle de processus Unix commandes.

  

Nous devrions en faire plus. Beaucoup plus de cela. Je parle de fork (2), execve (2), pipe (2), socketpair (2), select (2), kill (2), sigaction (2), et ainsi de suite. Ce sont nos amis. Ils veulent tellement nous aider.

J'ai un peu de code (un clone delay_job pour DataMapper qui, à mon avis, conviendrait parfaitement, mais je ne vois pas trop comment tirer parti des commandes répertoriées. Toutes les idées sur la façon d'améliorer ce code?

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
Était-ce utile?

La solution

Ahh oui ... les dangers de "Nous devrions en faire davantage". sans expliquer ce que chacun fait et dans quelles circonstances vous les utiliseriez. Pour quelque chose comme delay_job , vous pouvez même utiliser fork sans savoir que vous utilisez fork . Cela dit, cela n'a pas d'importance. Ryan parlait de l’utilisation de fork pour le préchargement de serveurs. delay_job utiliserait fork pour transformer un processus en démon. Même appel système, à des fins différentes. L'exécution de delay_job au premier plan (sans fork ) et en arrière-plan (avec fork ) aura pour résultat une différence de performances négligeable.

Cependant, si vous écrivez un serveur qui accepte les connexions simultanées, le conseil de Ryan est juste pour de l'argent.

  • fork : crée une copie du processus d'origine
  • execve : arrête d'exécuter le fichier actuel et commence à exécuter un nouveau fichier dans le même processus (très utile dans les tâches de rake)
  • pipe : crée un tuyau (deux descripteurs de fichier, un en lecture, un en écriture)
  • socketpair : comme un tuyau, mais pour les sockets
  • select : permet d'attendre qu'un ou plusieurs descripteurs de fichiers multiples soient prêts avec un délai d'attente
  • kill : utilisé pour envoyer un signal à un processus
  • sigaction : vous permet de changer ce qui se produit lorsqu'un processus reçoit un signal

Autres conseils

Cinq mois plus tard, vous pouvez consulter ma solution à l'adresse http://github.com/antarestrader/Updater. Regardez lib / updater / fork_worker.rb

scroll top