параллельная обработка с аргументами из файла - PullRequest
0 голосов
/ 04 июня 2018

У меня есть 10-строчный файл apps.txt , содержащий информацию (идентификатор приложения, ключ API и секретный ключ) о 10 приложениях.Поля в каждой строке файла являются аргументами программы, взаимодействующей с сервером.Другой файл data.txt , содержащий данные в качестве входных данных для программы.Я хочу, чтобы программа запускала один экземпляр для каждой строки в apps.txt и разделяла data.txt на количество приложений для обработки.Как использовать GNU Parallel для этого?Я попробовал приведенную ниже команду, но не могу получить желаемое поведение:

cat data.txt | parallel [-N1] -j10 --pipe --no-run-if-empty --line-buffer ./program.py {1} {2} {3} :::: apps.txt

apps.txt
AppID1 API_Key1 Secret_Key1
AppID2 API_Key2 Secret_Key2
...
AppID10 API_Key10 Secret_Key10

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Я интерпретирую ваш вопрос так, что у вас есть 10 работников, и вы хотите распределить блоки stdin на них.

Используйте строку замены слота GNU Parallel и получите массив, индекс которого является информациейработник.Массивы Bash считают индекс от 0, поэтому вычтите 1 из slot().

# Set each entry in array 'worker' to one line from apps
parset worker echo :::: apps.txt
doit() {
  workerid="$1"
  echo "do stuff on ${worker[$workerid]}"
  # Read stuff from stdin and do 'wc' on that
  wc
}
# env_parallel is needed to get $worker exported
# -j10 must be the number of lines in apps.txt
cat data.txt | env_parallel -j10 --pipe doit '{= $_=slot()-1 =}'
0 голосов
/ 04 июня 2018

Я не очень понимаю, что вы сказали о data.txt.Я просто знаю:

  1. Разделить файл

    $ split -l 10 data.txt -d -a 4 split_file

    Эта команда сгенерирует {split_file000, split_file001, ...} из data.txt в соответствии с количеством строк (10).

  2. Команда разделения и передачи

    $ cat app.txt |xargs -n 3 ./program.py

    Эта команда равна:

    $ ./program.py APPID1 APP_KEY1 SECRET_KEY1

    $ ./program.py APPID2 APP_KEY2SECRET_KEY2

    $ ...

...