Skip to main content
 首页 » 编程设计

python之将 xargs 用于并行 Python 脚本

2025年05月04日17yxwkf

我目前有一个带有两个嵌套循环的 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 

所以这产生了 100 个运行 script.py 的 Python 进程,每个进程对应一个 (a,b) 对。但是,我的机器只有 5 个内核,所以我想将进程数限制在 5 个,以避免抖动/浪费切换。目标是我总是运行 5 个进程,直到完成所有 100 个进程。

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

seq 1 | xargs -i --max-procs=5 bash script.sh 

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

我想我误解了 xargs 的工作原理。

谢谢!

请您参考如下方法:

这实际上看起来更像:

#!/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 

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

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

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

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

-x(与 -n 2 结合使用)表示如果不能为单个 Python 实例提供两个参数(例如,如果参数太长以至于两者都不能放在一个命令行中),这应该被视为失败,而不是仅使用一个参数调用 Python 实例。