Как расширить переменную вне многопоточного цикла while - PullRequest
1 голос
/ 11 октября 2019

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

Насколько я понимаю, многопоточный цикл while заставляет массив быть пустым после завершения цикла while. Каждый поток выполняется в своей собственной среде, и значение массива не выходит за пределы этой среды. Я хотел бы иметь возможность расширить это значение массива за пределы потока, если это возможно. В настоящее время я просто записываю строковое значение во временный файл, а затем после цикла while, считываю содержимое временного файла и сохраняю его в виде массива. Этот метод работает, так как файл обычно не слишком большой, но я бы хотел избежать записи в файл, если это возможно

Мой код - doDeepLookup на самом деле является вызовом API, но для аргументации позволяетпросто скажите, что он добавляет текст перед строкой чтения из цикла while

#!/bin/bash
n=0
maxjobs=20

resultsArray=""
while IFS= read -r line
        do
        IPaddress="$(echo $line | sed 's/ /\n/g' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")"
        doDeepLookup "$line" "$IPaddress" &
        if(( $(($((++n)) % $maxjobs)) == 0 )) ; then
                wait
        fi
        done <<< "$(printf '%s\n' "${SomeOtherArray[@]}")"
        printf '%s\n' "${resultsArray[@]}" #Returns NULL

doDeepLookup() {
   results="$(echo "help me : $line")"
   resultsArray+=($results)
}

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

С parset из GNU Parallel вы бы сделали что-то вроде:

parset resultsArray doDeepLookup ::: "${DeepArray[@]}" 
printf '%s\n' "${resultsArray[@]}"
0 голосов
/ 11 октября 2019

Благодаря Уильяму

#!/bin/bash
n=0
maxjobs=20


WhileLoopFunction() {
    resultsArray=""
    while IFS= read -r line
        do
        IPaddress="$(echo $line | sed 's/ /\n/g' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")"
        doDeepLookup "$line" "$IPaddress" &
        if(( $(($((++n)) % $maxjobs)) == 0 )) ; then
                wait
        fi
        done <<< "$(printf '%s\n' "${SomeOtherArray[@]}")"
}

doDeepLookup() {
   results="$(echo "help me : $line")"
   echo $results
}

resultsArray=( $(WhileLoopFunction"${DeepArray[@]}") )
printf '%s\n' "${resultsArray[@]}"
...