我正在使用一台具有 10k 核心的计算机,但一次只允许访问 1,000 个核心。
我有一个脚本可以在多个地方受益于 GNU 并行。并行处理 A 级,并在该脚本内执行 30 倍的操作。
--link
重新编写整个脚本以使用并行和语法将需要大量工作::: A B C ::: $(seq 30)
。
有没有一种方法可以让两个独立的调用parallel
能够进行足够的通信,从而将两者之间的作业总数限制为 1000 个?
答案1
如果我理解正确的话,您想要运行 2 个(或更多实例)GNU Parallel,并且您希望正在运行的作业总数小于 1000。
因此,在某个时刻,其中一个可能会运行 300 个作业,而另一个则应限制为 700 个作业。
--limit
是为这种特殊情况而设计的:它将运行您选择的脚本,并根据退出值限制作业数量。
所以现在您需要某种方法来确定正在运行的作业总数。
也许某种[ $(ps aux | grep myprogram | wc -l) -gt 1000 ]
?
(什么怪物有10k核心?)
答案2
另一种解决方案可能是使用--sqlmaster/--sqlworker
.
生成 1000 --sqlworker
s 并将要运行的作业放入数据库中--sqlmaster
。
master1$ seq 10000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.1{}
# The + is needed to append to existing table
master2$ seq 4000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.2{}
worker1..1000$ parallel --sqlworker +pg://user:pass@server/db/table
我认为这比版本不太敏感--limit
- 特别是因为你是在集群上运行 - 而不是在一台机器上。