Операция fork
— это системный вызов Unix, который создает новый процесс путем копирования текущего. В Ruby он предоставляет мощные возможности для параллельной обработки.
pid = fork do
# Этот код выполняется в дочернем процессе
puts "Child process: #{Process.pid}"
end
puts "Parent process: #{Process.pid}"
Process.wait(pid) # Ожидание завершения дочернего процесса
data_chunks = [chunk1, chunk2, chunk3]
data_chunks.each do |chunk|
fork do
process_chunk(chunk) # Обработка в отдельном процессе
end
end
Process.waitall # Ожидание всех дочерних процессов
def safely
pid = fork do
begin
yield
rescue => e
exit!(1) # Выход с кодом ошибки
end
end
_, status = Process.wait2(pid)
status.success?
end
safely { dangerous_operation() }
pid = fork do
Process.setsid # Стать лидером новой сессии
exit if fork # Создать "внутреннего" демона
# Код демона
loop do
perform_task
sleep 60
end
end
Process.detach(pid) # Отсоединить демона
reader, writer = IO.pipe
fork do
reader.close
writer.write "Message from child"
end
writer.close
puts reader.read # => "Message from child"
large_array = Array.new(1_000_000) { "data" }
fork do
# До модификации память разделяется
large_array[0] = "modified" # Теперь копируется страница памяти
end
pids = []
3.times do |i|
pids << fork { sleep i; puts "Done #{i}" }
end
pids.each { |pid| Process.wait(pid) }
trap('TERM') { puts "Child terminated"; exit }
fork do
# Код, реагирующий на сигналы
sleep 10
end
Process.kill('TERM', pid)
Передача объектов:
Глобальные состояния:
Отладка:
Threads:
Process.spawn:
Distributed workers:
fork do
Process.setrlimit(:CPU, 10) # Ограничить CPU 10 секундами
infinite_loop()
end
fork do
Dir.chdir('/tmp') # Изменить рабочий каталог
# Дальнейшая изоляция
end
Операция fork
в Ruby позволяет:
Основные правила:
fork
для CPU-интенсивных задачПример выбора: