#linux #raku
#linux #raku
Вопрос:
У меня есть такой хороший вариант … прямо из документации
my $proc = Proc::Async.new: ‘raku’, ‘script.raku’;
$proc.stdout.tap(-> $v { print "Output: $v" }, quit => { say 'caught exception ' ~ .^name });
$proc.stderr.tap(-> $v { print "Error: $v" });
my $promise = $proc.start;
Thread.start: { await $promise;}
sleep 30;
Скрипт выдает данные в stdout и stderr.
Но
она печатает только одну строку..
Вывод: что-то
Он прекращает вывод информации… Скрипт выдает гораздо больше выходных данных.. В чем может быть проблема?
Ответ №1:
Вам нужно await $promise
в конце вашей программы, иначе она может просто завершиться до завершения работы вызываемой вами программы.
Обновление (после того, как ОП отредактировал свой пост).
OP также сказал off stackoverflow:
Полный вывод печатается при завершении программы.. со значительной задержкой.
Если это так, проблема, скорее всего, связана с вызываемой программой, которая буферизует свой стандартный вывод (и, возможно, STDERR), и поэтому наблюдающая программа даже не имеет раннего доступа к своему выводу.
Может помочь вызов flush для соответствующего дескриптора в вызываемой программе.
Комментарии:
1. нет, я добавил больше информации.
2. Если я запускаю ту же программу в командной строке, этого не происходит… Строки распечатываются ранее.
3. прямой запуск программы в терминале обычно включает буферизацию строк, запуск ее в канале переключает ее на блокировку буферизации. Я думаю, вы получите тот же результат, если запустите свою другую программу
| cat
.