Блокировка вызова в Попене - PullRequest
0 голосов
/ 01 мая 2011
pipe = IO.popen('./myblockingprogram')
while line = pipe.gets
  puts "hello world"
end

, где myblockingprogram - это некоторая программа, которая блокирует получение данных по сети, а затем печатает некоторый текст на стандартный вывод.Протестированный запуск его из bash напрямую работает отлично.

Однако, когда я запускаю программу выше, я никогда не вижу строк "hello world", напечатанных на stdout (консоль).Я ошибаюсь, что popen запускает совершенно новый процесс ... и поэтому, хотя он и выполняет блокирующий вызов, он не должен препятствовать запуску основной программы ruby ​​из-за некоторой глобальной блокировки интерпретатора?

Есть ли лучший способчтобы структурировать программу, подобную этой, где я хочу прочитать текстовые строки, выведенные другой программой, и обработать результаты каким-либо образом (нет завершающего условия, оно может выполняться вечно)?

Ответы [ 2 ]

2 голосов
/ 01 мая 2011

Убедитесь, что myblockingprogram очищает выходной буфер при записи в stdout.

Простой пример myblockingprogram:

#!/bin/ruby
100.times do
    sleep 10
    $stdout.puts "Hello World"
    $stdout.flush
end

Без команды flush вы не видите никакого результата изтруба, пока не завершится подпроцесс.С помощью команды flush вы увидите промежуточные результаты подпроцесса.

1 голос
/ 01 мая 2011

Я думаю, вы просто должны убедиться, что сторона Ruby и открытый процесс "сотрудничают" и не блокируют друг друга. Если запуск программы myblocking занимает много времени, вам может потребоваться использовать асинхронные методы для предотвращения длительной блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...