2015-01-29 2 views
2

У меня есть этот oprint скрипт:Использование `sleep` делает трубы, чтобы не работать

#!/usr/bin/env ruby 

amount = 100 
index = 0 
loop do 
    index += 1 
    if index % 5 == 0 
    amount += 10 
    end 

    sleep 0.1 
    $stdout.puts amount 
end 

Если я бегу oprint | echo, то я не вижу ничего. Если я прокомментирую sleep 0.1 внутри oprint, то я вижу много выходных данных. Делает ли sleep разрыв трубы? Есть ли исправление?

+0

Получите идею отсюда - https://www.ruby-forum.com/topic/152548? –

+0

Добавьте '$ stdout.flush' после' $ stdout.puts', чтобы решить эту проблему. Любопытно узнать почему. –

+0

На моей ОС (mac os x, zsh) ваша программа с комментариями 'sleep' заполняет трубку и заканчивается исключением' Broken pipe '- (Errno :: EPIPE) '. ИМО это ожидаемое поведение – Grych

ответ

1

oprint | echo действительно не должен работать, потому что echo не считывает входной поток. Это приводит к его аргументам. Если вы хотите протестировать простую трубу, то более подходящим будет oprint | cat.

Даже после этого вы должны добавить $stdout.flush после puts, когда у вас есть бесконечный цикл. Поскольку множество небольших вызовов ввода-вывода может быть узким местом производительности, Ruby буферизует свой вывод по умолчанию - это означает, что он хранит много небольшого количества в буфере, а затем записывает весь буфер одновременно. Промывка буфера вручную гарантирует, что он не будет в конечном итоге ждать вечно, чтобы выполнить фактическую запись.

Выполнение этих двух изменений дает мне ожидаемый результат.

+0

Спасибо за объяснение –

Смежные вопросы