Gnu并行:是否为每个作业并行重新加载程序?

时间:2019-04-17 16:09:20

标签: bash parallel-processing gnu-parallel

假设我有一个程序在运行之前加载了很多内容...但这是一次缓慢的运行。

接下来,我写:

function(errormsg)

这会增加每个作业的负载开销吗?

如果确实引起了开销,有办法避免吗?

2 个答案:

答案 0 :(得分:1)

parallel对正在运行的程序的内部运作一无所知。每个实例都独立运行,因此无法将一个调用的初始化复制到其他实例。

如果您希望应用程序初始化一次,然后并行运行多个实例,则需要将其设计到应用程序本身中。它应该加载数据,然后使用fork()创建使用此数据的多个进程。

答案 1 :(得分:1)

正如@Barmar所说,示例中的每个块都将启动./mycode

但是由于您在示例中未使用-k,因此您可以使用--round-robin

... | parallel -j 8 --spreadstdin --round-robin --block $sz ... ./mycode

这将开始8个./mycode(但每个块都不一个),并将块分配给任何准备读取的进程。

此示例显示,与进程4和5相比,为进程11和10分配了更多的块,因为4和5读取速度较慢:

seq 1000000 |
  parallel -j8 --tag --roundrobin --pipe --block 1k 'pv -qL {}0000 | wc' ::: 11 4 5 6 9 8 7 10