Почему 2-я команда не ожидает вывода 1-го (конвейера )?

Я не эксперт по tmux, но, возможно, вы могли бы улучшить эту идею :разделить панель на две стороны -по -стороне и показать список убывающих чисел в новой панели, который заканчивается на 0 для самой нижней строки. Например, в вашем ~/.tmux.confустановите привязку для символа=

bind-key -T copy-mode-vi = split-window -h -p 90 'seq 24 -1 1;sleep 15'\;  swap-pane -dU

Затем в режиме копирования vi ввод =разделит текущую панель и перечислит числа от 24 до 1 в новой панели на 15 секунд. Так как новая панель помещается справа, swap-paneперемещает ее влево.

1
15.11.2021, 20:06
1 ответ

the 2nd command can start executing without its input being ready.

Да. В этом нет ничего плохого.

В конвейере producer | consumerдве стороны работают одновременно¹. Потребитель не ждет, пока производитель закончит. Его даже не волнует, начал ли продюсер. Все, что нужно потребителю, — это место, откуда можно прочитать информацию. Это место существует, как только канал был создан вызовом pipe.

Чтение из канала является блокирующей операцией. Если данные еще не были записаны в канал, считыватель блокируется. Читатель будет разблокирован, когда данные будут записаны в канал. В более общем случае считыватель блокируется, если в канале нет доступных данных. Чтение данных из канала потребляет их. Поэтому не имеет значения, начал ли производитель писать к тому времени, когда потребитель начал читать. Потребитель будет просто ждать, пока производитель запишет некоторые данные.

Потребитель получает данные, как только они становятся доступными.² Обычно он считывает и обрабатывает данные фрагментами. Большинству потребителей не нужно иметь все данные, прежде чем они смогут начать их обработку. Если потребителю действительно нужны все доступные данные, он сохранит их в памяти или во временном файле и дождется окончания ввода.

Поскольку производитель и потребитель являются отдельными процессами, они выполняются одновременно. Тот факт, что один из них может быть запущен, не препятствует запуску другого. Если и производителю, и потребителю требуется процессорное время, ядро ​​будет делить ЦП между ними (и между любым другим процессом, которому требуется процессорное время ). Таким образом, даже когда потребитель инициализируется или обрабатывает некоторые данные, производитель также может работать и производить больше данных.

¹ Можно сказать, что они идут параллельно. Технически это не правильно, но достаточно близко.
² На практике производитель может буферизовать данные внутри себя. Но как только производитель действительно записывает данные в канал, потребитель может их прочитать.

5
15.11.2021, 20:33

Теги

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