我有一个 python 脚本,它获取 1 个命令行参数
python arg
现在我想要一个bash
脚本:
python arg &
使用参数 arg=000进行调用- 做这个
x
-次
因此:
python 000 &
python 001 &
...
python 00x &
如果其中一个进程完成,脚本应该派生一个新进程
python 00x+1 &
直到一个数字N
。
脚注:
- 我非常清楚,我正在尝试做的这听起来像是一个丑陋的解决方案 - 但是我被迫通过各种原因这样做,这超出了我的范围
- 我知道我把所有的工作都留给了社区,但是我所有的谷歌搜索和浏览都导致脚本为零,因此我不得不保持原样。
编辑:我需要一个不使用的解决方案parallel
。
答案1
听起来您想并行运行多个 Python 脚本实例,但一次只能运行这么多实例,当一个实例完成时,再启动另一个实例。有一个方便的实用程序,称为“parallel”,可与命令“seq”结合使用以生成数字列表。
seq -f '%03.0f' 0 N | parallel -j x "python {}"
在上面的例子中,将 N 替换为上限。将 x 替换为同时运行的最大脚本数量。
seq 生成数字列表。
$ seq 5
1
2
3
4
5
$ seq 0 5
0
1
2
3
4
5
$ seq -f '%03.0f' 0 5
000
001
002
003
004
005
最后一部分看起来像您想要使用的数字序列... 5 是您可以更改的任意端点。
这并行 -jx “命令{}” 每次同时运行 x 个命令副本,用 seq 生成的列表中的一个值替换 {}。因此,如果您有一个 000-100 的序列并提供 -j 3,它将运行:
python 000
python 001
python 002
同时执行所有任务。当其中一个任务退出时,假设“python 001”首先完成,它将启动“python 003”。假设“python 000”接下来完成,它将接着替换“python 004”,依此类推,直到完成所有 101 个任务。
显然,您不想将 -j 设得太高,否则会导致系统超载。
seq 是一个非常标准的 Linux 命令。parallel 是可选包,可通过系统的包管理器安装。奇怪的是,基于 RedHat 的系统不包含它,但您可以从官方网站获取源代码和二进制文件:
答案2
基于上一个答案,但不是使用 GNU parallel,而是使用带有选项 -P 选项的标准命令“xargs”:
seq -f '%03.0f' 0 999 | xargs -n 1 -P 4 python
尝试以下方法来查看进程如何并行运行:
seq 0 10 | shuf | xargs -n 1 -P 3 -I % sh -c "echo start %; sleep %; echo done %"