gpt4 book ai didi

python - 将 xargs 用于并行 Python 脚本

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:14 24 4
gpt4 key购买 nike

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

关于python - 将 xargs 用于并行 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39713719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com