Глобальный счетчик, увеличенный функциями, выполняющимися параллельно в подоболочках - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть сценарий оболочки, который выполняет тяжелую работу и отслеживает то, что он делает, используя счетчики.Тяжелая работа должна быть выполнена примерно для 30 случаев, и, поскольку машина, на которой я ее использую, имеет 48 ядер, ее легко распараллелить: я просто запускаю функцию в фоновом режиме, создавая подоболочку.Однако это означает, что я не могу увеличить глобальную переменную:

$ cat mwe.sh
#!/bin/bash
counter1=0
counter2=0
counter3=0
func() {
    # do some heavy work which may increase one counter
    counter2=$((counter2 + 1))
}

func &
func &
func &
wait

echo $counter1 $counter2 $counter3
$ ./mwe.sh
0 0 0

Функции Bash не имеют возвращаемых значений как таковых .Ответы на Приращение счетчика в цикле Bash не работает предлагают записать в файл и затем прочитать его, что потребует временного файла для каждого отдельного вызова, что связано с некоторыми накладными расходами.Другие предложения заключаются в том, чтобы использовать echo для «возврата» строки, но если я использую для этого стандартный вывод, функции не могут записать что-либо еще в стандартный вывод.

Как отслеживать глобальные счетчики в сценарии оболочки bash, когда тяжелая работа выполняется в подоболочках, работающих параллельно?Есть ли какой-нибудь способ открыть выделенный поток / канал для каждого вызова функции, в который функция может писать и из которого может читать вызывающая сторона?Или есть какой-то другой способ, которым я могу отслеживать это, не записывая файл для каждого вызова?

...