【发布时间】:2017-02-04 10:32:55
【问题描述】:
我目前有一个带有两个嵌套循环的 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 的工作原理。
谢谢!
【问题讨论】:
-
xargs不能也不会改变其子进程启动自己的子进程的方式;相反,它提供了对其如何启动子流程的控制。 -
对于 Python,我实际上建议使用 Python
multiprocessing模块而不是xargs。或者 GNUparallels实用程序。 docs.python.org/3/library/multiprocessing.html -
@Wolph,我绝对同意:多处理。至于 GNU 并行——它是一个比
xargs更大、更复杂、更复杂的代码库,相比之下,xargs是一个简单的模型。鉴于 Pythonist 对简单性的偏好,我认为 xargs 是两者之间的明显选择。 :) -
@CharlesDuffy 这很公平。但与此同时,它可以更好地控制并行进程的执行方式,并且比 GNU 特定的 xargs 扩展更具可移植性:)
-
@Wolph,不是 GNU 特定的;
--max-procs是 GNUism,但-P也适用于 OS X 和现代 FreeBSD。
标签: python bash parallel-processing xargs