Domanda

Ryan Tomayko ha scatenato una tempesta di fuoco con questo post sull'uso del controllo di processo Unix comandi.

  

Dovremmo fare di più. Molto di più di questo. Sto parlando di fork (2), execve (2), pipe (2), socketpair (2), select (2), kill (2), sigaction (2) e così via e così via. Questi sono i nostri amici Vogliono così tanto solo aiutarci.

Ho un po 'di codice (un clone delayed_job per DataMapper che penso si adatterebbe perfettamente a questo, ma non sono chiaro su come sfruttare i comandi elencati. su come migliorare questo codice?

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
È stato utile?

Soluzione

Ahh sì ... i pericoli di " Dovremmo fare di più di questo " senza spiegare cosa fanno ciascuno di loro e in quali circostanze li useresti. Per qualcosa come delayed_job potresti persino usare fork senza sapere che stai usando fork . Detto questo, non importa davvero. Ryan stava parlando dell'uso di fork per i server di preforking. delayed_job userebbe fork per trasformare un processo in un demone. Stessa chiamata di sistema, scopi diversi. L'esecuzione di delayed_job in primo piano (senza fork ) e in background (con fork ) comporterà una differenza di prestazioni trascurabile.

Tuttavia, se scrivi un server che accetta connessioni simultanee, ora il consiglio di Ryan è giusto.

  • fork : crea una copia del processo originale
  • execve : interrompe l'esecuzione del file corrente e inizia a eseguire un nuovo file nello stesso processo (molto utile nelle attività di rake)
  • pipe : crea una pipe (due descrittori di file, uno per la lettura, uno per la scrittura)
  • socketpair : come una pipe, ma per socket
  • seleziona : aspettiamo che uno o più descrittori di file multipli siano pronti con un timeout
  • kill : utilizzato per inviare un segnale a un processo
  • sigaction : consente di modificare ciò che accade quando un processo riceve un segnale

Altri suggerimenti

5 mesi dopo, puoi visualizzare la mia soluzione su http://github.com/antarestrader/Updater. Guarda lib / updater / fork_worker.rb

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top