输出到同一个文件序列
Output to the same file sequence
假设我们有 myScript.sh 如下:
#!/bin/bash
do something with > bla.txt
do something with bla.txt > temp.txt
...
cat temp.txt >> FinalOuput.txt
然后我们运行并行如下:
parallel myScript.sh {} ::: {1..3}
是否按顺序写入输出? FinalOutput.txt
会先有 1
的结果,然后是 2
,然后是 3
。
注:
我目前正在输出到单独的文件,然后在并行完成后按要求的顺序合并它们,只是想知道我是否可以避免这一步。
这些进程是 运行 并行的。不仅不能保证它们会按顺序完成,甚至不能保证您可以让多个进程像这样写入同一个文件并最终得到有用的东西。
如果您要从多个进程写入同一个文件,您应该实施某种锁定以防止损坏。例如:
while ! mkdir FinalOutput.lock; do
sleep 1
done
cat temp.txt >> FinalOutput.txt
rmdir FinalOutput.lock
如果 order 很重要,您应该将每个脚本写入一个唯一的文件,然后 assemble 在所有并行作业完成后以正确的顺序输出最终结果.
#!/bin/bash
do something with > bla.txt
do something with bla.txt > temp-.txt
...
cat temp.txt >> FinalOuput.txt
然后在 parallel
完成后:
cat temp-*.txt > FinalOutput.txt
理想的方法是避免使用临时文件。这通常可以通过使用管道来完成:
parallel 'do something {} | do more | something else' ::: * > FinalOutput
但如果那是不可能的,那么使用依赖于 {#} 的 tmpfiles,它是 GNU Parallel 中的作业序列号:
doer() {
do something > .bla
do more .bla > .tmp
something else .tmp
}
export -f doer
parallel doer {} {#} ::: * > FinalOutput
假设我们有 myScript.sh 如下:
#!/bin/bash
do something with > bla.txt
do something with bla.txt > temp.txt
...
cat temp.txt >> FinalOuput.txt
然后我们运行并行如下:
parallel myScript.sh {} ::: {1..3}
是否按顺序写入输出? FinalOutput.txt
会先有 1
的结果,然后是 2
,然后是 3
。
注: 我目前正在输出到单独的文件,然后在并行完成后按要求的顺序合并它们,只是想知道我是否可以避免这一步。
这些进程是 运行 并行的。不仅不能保证它们会按顺序完成,甚至不能保证您可以让多个进程像这样写入同一个文件并最终得到有用的东西。
如果您要从多个进程写入同一个文件,您应该实施某种锁定以防止损坏。例如:
while ! mkdir FinalOutput.lock; do
sleep 1
done
cat temp.txt >> FinalOutput.txt
rmdir FinalOutput.lock
如果 order 很重要,您应该将每个脚本写入一个唯一的文件,然后 assemble 在所有并行作业完成后以正确的顺序输出最终结果.
#!/bin/bash
do something with > bla.txt
do something with bla.txt > temp-.txt
...
cat temp.txt >> FinalOuput.txt
然后在 parallel
完成后:
cat temp-*.txt > FinalOutput.txt
理想的方法是避免使用临时文件。这通常可以通过使用管道来完成:
parallel 'do something {} | do more | something else' ::: * > FinalOutput
但如果那是不可能的,那么使用依赖于 {#} 的 tmpfiles,它是 GNU Parallel 中的作业序列号:
doer() {
do something > .bla
do more .bla > .tmp
something else .tmp
}
export -f doer
parallel doer {} {#} ::: * > FinalOutput