使用 xargs 进行并行 Python 脚本

Bar*_*bot 2 python parallel-processing bash xargs

我目前有一个 bash 脚本 script.sh,带有两个嵌套循环。第一个枚举 a 的可能值,第二个枚举 b 的可能值,例如

#!/bin/sh
for a in {1..10}
do
    for b in {1..10}
    do
        nohup python script.py $a $b &
    done
done
Run Code Online (Sandbox Code Playgroud)

因此,这会产生 100 个运行 script.py 的 Python 进程,每对 (a,b) 一个。但是,我的机器只有 5 个核心,因此我希望将进程数限制为 5 个,以避免颠簸/浪费切换。我的目标是始终运行 5 个进程,直到所有 100 个进程完成为止。

xargs 似乎是执行此操作的一种方法,但我不知道如何将这些参数传递给 xargs。我检查过其他类似的问题,但不太了解周围的 bash 术语,无法知道发生了什么。例如,我尝试过

seq 1 | xargs -i --max-procs=5 bash script.sh
Run Code Online (Sandbox Code Playgroud)

但这似乎没有做任何事情 - script.sh 像以前一样运行并且仍然产生 100 个进程。

我认为我误解了 xargs 的工作原理。

谢谢!

Cha*_*ffy 5

这实际上看起来更像是:

#!/bin/bash
for a in {1..10}; do
  for b in {1..10}; do
    printf '%s\0' "$a" "$b"
  done
done | xargs -0 -x -n 2 -P 5 python script.py
Run Code Online (Sandbox Code Playgroud)

请注意,没有nohup,也没有任何&-- 来跟踪并发调用的数量,xargs需要直接执行 Python 脚本,并且该进程在完成之前无法退出。

非标准(但广泛可用)-0扩展要求输入采用 NUL 分隔形式(使用 创建printf '%s\0');这确保了带有空格、引号、反斜杠等的参数的正确行为。

同样的非标准-P 5设置了最大进程数(在某种程度上比 更便携--max-procs=5,它在 GNU 上受支持,但在现代 BSD xargs 上不受支持)。

表示-n 2Python 脚本的每个实例仅接收两个参数,因此每对输入启动一个参数。

-x与 结合使用-n 2)表示如果不能为单个 Python 实例提供两个参数(例如,如果参数太长以至于无法在单个命令行中容纳),则应将其视为失败,而不是仅使用一个参数调用 Python 实例。