/ / Wiele (z jednym stałym) argumentów GNU-parallel - linux, bash, przetwarzanie równoległe, gnu-parallel

Wiele (z jednym ustalonym) argumentów GNU-parallel - linux, bash, przetwarzanie równoległe, gnu-parallel

Używam funkcji GNU-parallel do wywoływania funkcji foo wielokrotnie. Funkcja przyjmuje dwa argumenty, nazwę pliku (a w poniższym przykładzie zapisane w tablicy A) i szereg filtrów (B poniżej, z b jako elementy B).

Funkcja powinna iterować nad wszystkimi kombinacjami A i Bjednak haczyk polega na tym, że faktycznie używam równolegle tylko do iteracji A, jednocześnie zapewniając B do każdego wywołania funkcji.

Jako minimalny przykład:

#!/bin/bash

A=("1" "2" )
B=("X" "Y")

foo() {
a=$1 # a single element of A
B=$2 # the whole array B
for b in "${B[@]}"; do
printf "a = %s; b = %sn" $a $b
done
echo "-----------------"
}
export -f foo

# goal:
echo "Sequential (aka, the target) ==="
for a in "${A[@]}"; do
foo $a $B
done

Wyniki

Sequential (aka, the target) ===
a = 1; b = X
a = 1; b = Y
-----------------
a = 2; b = X
a = 2; b = Y
-----------------

Pamiętaj, że zamiast pojedynczego połączenia z każdą kombinacją, mamy tylko dla każdego A wywołanie, a następnie w funkcji iteracji B.

Równoległe próby:

Wypróbuj 1

parallel foo ::: "${A[@]}" ::: "${B}"

Prowadzi do

a = 1; b = X
-----------------
a = 2; b = X
-----------------

(brak drugiego argumentu B)

Wypróbuj 2

parallel foo ::: "${A[@]}" ::: "${B[@]}"

Prowadzi do

a = 1; b = X
-----------------
a = 1; b = Y
-----------------
a = 2; b = X
-----------------
a = 2; b = Y
-----------------

(jedno połączenie na połączenie, a nie jedno połączenie na A, a następnie powtórzenie przez B)

Przejrzałem podręcznik i SO, ale nie mogłem znaleźć rozwiązania.

Mam wrażenie, że powinien działać, gdy bezpośrednio eksportuję tablicę B, ale również nie otrzymuję wyników

foo2() {
a=$1 # a single element of A
# B=$2 # the whole array B
for b in "${B[@]}"; do
printf "a = %s; b = %sn" $a $b
done
echo "-----------------"
}
export -f foo2
export B

parallel foo ::: "${A[@]}"

Prowadzi do

-----------------
-----------------

(najwyraźniej pusty B)

Odpowiedzi:

1 dla odpowiedzi № 1

Twój problem wynika z B być tablicą. Nigdy wcześniej nie widziałem, by tablica była przekazywana jako argument do funkcji i nie jestem pewien, czy da się to zrobić.

Drugą kwestią jest to, że podczas eksportowania zarówno funkcji, jak i zmiennych nie można wyeksportować tablicy bez oszustwa: Eksportowanie tablicy w skrypcie bash

GNU Parallel ułatwia ściąganie przy użyciu env_parallel. Spowoduje to wyeksportowanie pełnego środowiska do powłoki wykonującej komendę: tablice, zmienne, aliasy i funkcje. Zrobi to nawet przy zdalnym uruchamianiu poleceń.

env_parallel znacznie się poprawił w ubiegłym roku, więc zaktualizuj, jeśli masz problem z wersją.

#!/bin/bash

A=("1" "2" )
B=("X" "Y")

foo() {
a=$1 # a single element of A
#    B=$2 # the whole array B
for b in "${B[@]}"; do
printf "a = %s; b = %sn" $a $b
done
echo "-----------------"
}

# If you have earlier run "env_parallel --install"
# to activate env_parallel in your shell
# this should work.
env_parallel foo ::: "${A[@]}"

# If you have not, then this should work:
. `which env_parallel.bash`
env_parallel foo ::: "${A[@]}"