Utilizzo dei metodi di controllo dei processi Unix in Ruby
-
05-07-2019 - |
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
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