Паралельність у баші це прям first-class citizen. Трішечки простіших прикладів.
Якщо нам треба послідовно прочитати з двох процессів, то можна виконати щось на кшталт
Дебаг функція (простіше читати ніж strace)
log_with_sleep() {
local label=$1
echo "$(date +"%H:%M:%S.%3N") starting${label}"
sleep 1
echo "$(date +"%H:%M:%S.%3N") end${label}"
}
Простий приклад
послідовного виконування і читання (увага на дату):
(log_with_sleep "-1"; log_with_sleep "-2") | cat
# 10:08:06.474 starting-1
# 10:08:07.482 end-1
# 10:08:07.488 starting-2
# 10:08:08.498 end-2
Але якщо ми хочемо
послідовно прочитати, але виконувати функції
паралельно, то можна зробити так:
cat <(log_with_sleep 1) <(log_with_sleep 2)
# 10:10:05.529 starting1
# 10:10:06.538 end1
# 10:10:05.529 starting2
# 10:10:06.537 end2
А якщо треба
паралельно читати і
паралельно виконувати то можна зробити дуже просто:
(log_with_sleep "-1" & log_with_sleep "-2"& wait) | cat
# 10:11:43.079 starting-1
# 10:11:43.080 starting-2
# 10:11:44.094 end-1
# 10:11:44.094 end-2
Усе це можна комибінувати
(log_with_sleep "1"; cat <(log_with_sleep "2") <(log_with_sleep "3"); (log_with_sleep "3" & log_with_sleep "4" & wait); log_with_sleep "5") | cat
# 10:30:25.737 starting1
# 10:30:26.748 end1
# 10:30:26.754 starting2
# 10:30:27.763 end2
# 10:30:26.754 starting3
# 10:30:27.765 end3
# 10:30:27.773 starting3
# 10:30:27.775 starting4
# 10:30:28.786 end4
# 10:30:28.789 end3
# 10:30:28.796 starting5
# 10:30:29.805 end5
#bash@UkropsDigest #concurency@UkropsDigest #tricks@UkropsDigest