Являются ли Process :: detach и Process :: wait взаимоисключающими (Ruby)? - PullRequest
4 голосов
/ 29 сентября 2011

Я выполняю рефакторинг небольшой параллельной обработки на моем сервере Ruby on Rails (работающей в Linux) для использования Spawn.В документации Spawn::fork_it утверждается, что разветвленные процессы все еще можно ожидать после отсоединения: https://github.com/tra/spawn/blob/master/lib/spawn.rb (строка 186):

# detach from child process (parent may still wait for detached process if they wish)
Process.detach(child)

Однако в документации Ruby Process::detach говорится, что вам не следует делатьthis: http://www.ruby -doc.org / core / classes / Process.html

Некоторые операционные системы сохраняют статус завершенных дочерних процессов до тех пор, пока родительский процесс не соберет этот статус (обычноиспользуя какой-то вариант wait (). Если родитель никогда не собирает этот статус, дочерний процесс остается процессом зомби. Process :: detach предотвращает это, создав отдельный поток Ruby, единственной задачей которого является получение статуса pid процесса.когда он заканчивается. Используйте detach только в том случае, если вы не намерены явно ждать завершения дочернего процесса.

Тем не менее Spawn::wait эффективно позволяет вам сделать это, просто заключив в скобки Process::wait. Кстати, я специально хочу использовать метод Process::waitpid2 для ожидания дочерних процессов, а не метод Spawn::wait.

Отсоединит-и-подождать не правильно работает на Linux?Я обеспокоен тем, что это может вызвать состояние состязания между отсоединенным потоком жнеца и ожидающим родительским процессом в отношении того, кто первым получает дочерний статус.

1 Ответ

0 голосов
/ 22 июня 2012

Ответ на этот вопрос есть в документации.Вы пишете код для собственного использования в контролируемой среде?Или широко использоваться третьими лицами?Ruby написан для широкого использования третьими лицами, поэтому их рекомендация - не делать что-то, что может дать сбой в «некоторых операционных системах».Возможно, библиотека Spawn предназначена в первую очередь для использования на машинах Linux и протестирована только на небольшом подмножестве, где работает эта тактика.

Если вы распространяете код, который пишете, для использования всеми и всеми,Я бы выбрал подход Руби.

Если вы управляете средой, в которой будет выполняться этот код, я написал бы два теста:

  1. Тест, который порождает процесс, отсоединяет его и затемждет его.
  2. Тест, который порождает процесс, а затем просто ждет его.

Подсчитайте частоту отказов для обоих и, если они равны (в пределах чувствительности, которую вы считаетеприемлемо), дерзайте!

...