假设我有一个程序在运行之前加载重要内容......但这是一次性减速。
接下来,我写道:
cat ... | parallel -j 8 --spreadstdin --block $sz ... ./mycode
这是否会导致每一项工作的负载开销?
如果它确实引起了开销,有没有办法避免它?
正如@Barmar所说,./mycode
是针对你的例子中的每个块启动的。
但由于您在示例中没有使用-k
,因此您可以使用--round-robin
。
... | parallel -j 8 --spreadstdin --round-robin --block $sz ... ./mycode
这将启动8个./mycode
s(但不是每个块一个),并为任何准备读取的进程提供块。
此示例显示进程11和10的更多块比进程4和5更多,因为4和5读取速度较慢:
seq 1000000 |
parallel -j8 --tag --roundrobin --pipe --block 1k 'pv -qL {}0000 | wc' ::: 11 4 5 6 9 8 7 10
parallel
对您运行的程序的内部工作情况一无所知。每个实例独立运行,无法将一个调用的初始化复制到其他实例。
如果您希望应用程序初始化一次然后并行运行多个实例,则需要将其设计到应用程序本身。它应该加载数据,然后使用fork()
创建使用此数据的多个进程。