使用文件中的参数进行并行处理

parallel processing with arguments from file

我有一个 10 行的文件 apps.txt,其中包含 10 个应用程序的信息(应用程序 ID、api 密钥和密钥)。文件每一行中的字段都是与服务器交互的程序的参数。另一个文件 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

我不太明白你说的data.txt。我只知道:

  1. 拆分文件

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

    此命令将根据行数 (10) 从 data.txt 生成 {split_file000, split_file001, ...}。

  2. 拆分并传递命令

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

    这个命令等于:

    $ ./program.py APPID1 APP_KEY1 SECRET_KEY1

    $ ./program.py APPID2 APP_KEY2 SECRET_KEY2

    $ ...

我按照您有 10 个工人的方式来解释您的问题,并且您想将标准输入块分配给这些工人。

使用GNU Parallel 的slot replacement string 并有一个索引为worker 信息的数组。 Bash的数组从0开始计数索引,所以从slot()中减去1。

# Set each entry in array 'worker' to one line from apps
parset worker echo :::: apps.txt
doit() {
  workerid=""
  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 =}'