2017-02-16 30 views
1

Я пытаюсь сделать довольно простой процесс с использованием Perl. Фрагмент кода:Открытие трубы и задержки при анализе вывода в Perl

open(FH,"<command> |") or die "Could not run command .. $!\n"; 

print "After open\n"; 

while(<FH>) 
{ 
    print "I am inside loop\n"; 
    <process..something> 
} 

Я вижу некоторые необъяснимые задержки когда в то время как() называется. Я вижу, что open занял 9-10 мс для запуска (что находится в пределах диапазона), однако я вижу задержку в 200 - 250 мс между сообщениями «После открытия» и «Я внутри цикла».

Кто-нибудь видел что-нибудь подобное раньше? Любая помощь будет оценена по достоинству.

Благодаря Rajib

+1

Ну, что за «_command_» вы работаете и что он делает? Вы попадаете внутрь 'while' только один раз, когда-то _is_ читаете' ', так что это полностью зависит от того, что делает это «_command_». Если он должен был спать в течение 2 секунд, а затем печатать, тогда ваш 'while ()' будет сидеть там в течение 2 секунд. – zdim

+1

Обратите внимание, что рекомендуется использовать лексические дескрипторы файлов ('my $ fh') и три аргумента' open' и лучше. – zdim

+0

Я запускаю команду базы данных db2pd -db -активный, выход которого происходит довольно быстро (если я пытаюсь выполнить его вне программы). – rssarkar

ответ

1

Это почти наверняка, потому что выход из < команды > в буфер до тех пор, либо буфер не заполнится или процесс завершается

Вы, наверное, можно обойти с помощью unbuffer, что делает вид, что он выводит на терминал

Попробуйте использовать это вместо

open my $fh, '-|', 'unbuffer <command>' or die "Could not run command: $!\n"; 
+0

Спасибо большое, ребята. Я очень ценю всю помощь. После того, как я использовал предложение zdim об использовании 3-х опционного формата open(), время опустилось до ~ 150-160 мс, но когда я использовал команду Бородина, он опустился до 30-35 мс !! – rssarkar

+0

Последний код для открытого я использовал: open $ FH, '- |', 'unbuffer db2pd -db $ db -active 2>/dev/null' или die "Не удалось запустить команду .. $! \ N «; Я использовал 2>/dev/null, чтобы удалить сообщение sh: unbuffer, не найденное в моем файле журнала. Еще раз спасибо за помощь. – rssarkar

+0

@ rssarkar: Это совсем не так. Вы открываете трубу *** для *** команды вместо *** из *** этого, и вы не должны получать сообщение «unbuffer not found». Вы уверены, что ваша система имеет 'unbuffer'? – Borodin