使用 xargs 进行并行 Python 脚本

2024-02-21

我目前有一个 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 的工作原理。

Thanks!


这实际上看起来更像是:

#!/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 不支持)。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 xargs 进行并行 Python 脚本 的相关文章

随机推荐