Ориентированный на многопотоковое исполнение внешний процесс в рубине, плюс проверка exitstatus

Я хочу выполнить ориентированную на многопотоковое исполнение часть сценария в Ruby, который называет внешнюю программу, затем проверяет статус выхода той внешней программы. Что лучший способ состоит в том, чтобы сделать это? До сих пор я проверял $?, но я думаю, что получаю состояние состязания с другими частями программы.

Вот некоторый пример кода:

Thread.new do
  `external_program`
  if $?.exitstatus == 0
    # it worked.
  else
    # it didn't work.
  end
end

Идеально, я сделал бы что-то как

Process.new(`external_program`).exitstatus

так, чтобы exitstatus был неразрывно связан с тем процессом, а не последним, который, оказалось, завершался. Там какой-либо путь состоит в том, чтобы сделать это?

9
задан Andrew Grimm 10 May 2011 в 02:03
поделиться

1 ответ

Если вы сделали это на основе size :

  • Используйте subprocess , чтобы запустить 'du -sb' и получить total_size корневого каталога
  • По мере продвижения проверьте размер каждого файла и уменьшение от вашего total_size (давая вам remaining_size)
  • pct _ complete = (total_size - remaining_size )/ total_size

Thoughts?

-aj

-121--2835541-

http://gcc.gnu.org/wiki/Visibility

Это полное руководство по экспорту в msvc и gcc.

-121--1238896-

Хотя rb_last_status (он же $? ) является глобальной переменной, Руби делает магический трюк, чтобы сделать его для каждого потока: В rb _ thread _ save _ context он сохраняет rb _ last _ status в структуре старого потока; rb _ thread _ restore _ context устанавливает rb _ last _ status из сохраненного значения. Если у вас есть гонка с участием $? , это ошибка Руби.

17
ответ дан 4 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: