1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
# encoding: utf-8
# @private
EMFORK = $0 == __FILE__
#if EMFORK
# require 'rubygems'
#end
require 'eventmachine'
# helper to fork off EM reactors
# @private
def EM.fork num = 1, &blk
unless @forks
trap('CHLD') {
pid = Process.wait
p [:pid, pid, :died] if EMFORK
block = @forks.delete(pid)
EM.fork(1, &block)
}
trap('EXIT') {
p [:pid, Process.pid, :exit] if EMFORK
@forks.keys.each { |pid|
p [:pid, Process.pid, :killing, pid] if EMFORK
Process.kill('USR1', pid)
}
}
@forks = {}
end
num.times do
pid = EM.fork_reactor do
p [:pid, Process.pid, :started] if EMFORK
trap('USR1') { EM.stop_event_loop }
trap('CHLD') {}
trap('EXIT') {}
blk.call
end
@forks[pid] = blk
p [:children, EM.forks] if EMFORK
end
end
# @private
def EM.forks
@forks ? @forks.keys : []
end
if EMFORK
p 'starting reactor'
trap('INT') { EM.stop_event_loop }
EM.run {
p [:parent, Process.pid]
EM.fork(2) {
EM.add_periodic_timer(1) do
p [:fork, Process.pid, :ping]
end
}
}
p 'reactor stopped'
end
|