Я хочу разгрузить блок кода в моем основном процессе дочерним процессом, чтобы он запускался одновременно. Я также хочу иметь PID порожденного дочернего процесса, чтобы я мог контролировать и убивать его, если это необходимо.Как вы создаете дочерний процесс в Ruby?
ответ
Вы можете использовать метод ядра fork
. Ниже приведен пример:
#!/usr/bin/env ruby
puts "This is the master process."
child_pid = fork do
puts "This is the child process"
exit
end
puts "The PID of the child process is #{child_pid}"
Метод fork
возвращает PID процесса он вилок и выполняет какой-либо код в блоке прошло. Как и обычные блоки Ruby, он сохраняет привязки родительского процесса.
Это хорошая идея, чтобы сделать разветвленный процесс exit
.
В дополнение к замечательному ответу Криса, не забудьте позвонить Process.wait
от своего хозяина, чтобы пожинать ваш детский процесс, иначе вы оставите зомби позади.
Примера в соответствии с просьбой в комментариях:
pid = Process.fork do
puts "child, pid #{Process.pid} sleeping..."
sleep 5
puts "child exiting"
end
puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
puts "parent exiting"
Если вы счастливы использовать темы, а не процессы, а затем что-то вроде этого может быть немного более масштабируемым больше, чем одна вилка:
def doit(x)
sleep(rand(10))
puts "Done... #{x}"
end
thingstodo = ["a","b","c","d","e","f","g"]
tasklist = []
# Set the threads going
thingstodo.each { |thing|
task = Thread.new(thing) { |this| doit(this) }
tasklist << task
}
# Wait for the threads to finish
tasklist.each { |task|
task.join
}
Ознакомьтесь с замечательными комментариями и топологией Джона Топли, касающимися модели исполнения Ruby и ее ограничений.
Просто отредактирован, чтобы исправить вопиющую ошибку (не присваивания к задаче), и следовать @ совет (Jason King) 's.
В 1.9 вы можете использовать команду Process.spawn. Смотрите также http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
Хорошая альтернатива вилка/Exec/мицелий является POSIX отродье камень для Ruby 1.9: https://github.com/rtomayko/posix-spawn
Они большую часть тяжелой работы, чтобы сделать его более легким, эффективным и гибким по сравнению с методы нижнего уровня.
- 1. Как вы создаете другой процесс в C?
- 2. Как вы создаете DataTemplates/ссылку на дочерний datatemplate в WPF?
- 3. Как вы создаете Rakefile?
- 4. Как вы это создаете?
- 5. Как вы создаете коллекцию GenuineVariableDescriptors?
- 6. Как вы создаете MouseEvent?
- 7. Как убить порожденный дочерний процесс в скрипте ruby / bash
- 8. Как убить дочерний процесс
- 9. Трубопровод в дочерний процесс в другой дочерний процесс
- 10. Ruby. Как вы создаете строку с фиксированным количеством символов?
- 11. как вы создаете скрипт cron?
- 12. Как вы создаете RSS-канал?
- 13. как вы создаете социальный граф?
- 14. Как вы создаете свои фабрики?
- 15. Как вы создаете AFRAME кнопку
- 16. Как вы создаете последовательность modalViewControllers?
- 17. Как вы создаете закрытую воронку?
- 18. Как вы создаете плагин jQuery?
- 19. Как вы создаете индексатор торрентов?
- 20. Как вы создаете PHP-код?
- 21. Как вы создаете двухмерную коллекцию?
- 22. как вы создаете большой массив?
- 23. Как вы создаете английское слово?
- 24. Как вы создаете подобные эффекты?
- 25. Как вы создаете большой массив?
- 26. родительский процесс и дочерний процесс
- 27. Вы создаете словарь данных?
- 28. Как вы создаете базу данных OLAP?
- 29. создать дочерний процесс
- 30. Запустите дочерний процесс в другой версии рубина
Одна вещь, которую следует помнить с помощью Ruby, заключается в том, что не все работает точно так же, как в Windows по сравнению с * nix. Иногда они полностью не реализованы в Windows, поэтому используйте свою собственную опасность. – Daemin 2008-11-22 17:33:33
Этот вообще не работает в Windows – vava 2009-02-14 04:55:00
@Vadim Я думаю, что это особенность, а не ошибка. – 2009-02-15 23:57:41