Nextflow进程彼此独立执行,不共享公共(可写)状态。他们可以通信的唯一方式是通过异步 FIFO 队列,称为通道。
输入限定符允许在path
流程执行上下文中处理文件。Nextflow 将在流程执行目录中暂存文件,以便脚本可以访问它们。请注意,path
限定符是在 19.10.0 版本中引入的,作为限定符的替代品,在使用最新版本的 Nextflow 时file
应该首选。
在您链接的代码中,三个进程中的每一个都使用storeDir指令。这与“通常情况”的情况相去甚远。storeDir 指令指定的目录旨在作为进程结果的永久缓存。通常,这些类型的流程会产生很大的一次性成本,您希望避免在以后的运行中再次支付。
我重构了您的示例,以表明当从工作目录中删除文件“a”时,进程 A 和 C 确实被重新执行:
process A {
output:
path 'a.txt' into a_ch
"""
seq 1 3 > a.txt
"""
}
process B {
output:
path 'b.txt' into b_ch
"""
seq 4 5 > b.txt
"""
}
process C {
input:
path a_txt from a_ch
path b_txt from b_ch
output:
path 'c.txt'
"""
cat "${a_txt}" "${b_txt}" > c.txt
"""
}
$ nextflow run test.nf
N E X T F L O W ~ version 20.10.0
Launching `test.nf` [agitated_payne] - revision: baea5be781
executor > local (3)
[29/4bba82] process > A [100%] 1 of 1 ✔
[d8/978a8d] process > B [100%] 1 of 1 ✔
[14/999791] process > C [100%] 1 of 1 ✔
$ find . -type f -name '*.txt'
./work/14/9997911fcc4587f565822e4c8a238c/c.txt
./work/29/4bba8269b9337f28d20225d605b7cf/a.txt
./work/d8/978a8df7e7e1e5885007ebb0e2915d/b.txt
$ rm ./work/29/4bba8269b9337f28d20225d605b7cf/a.txt
$ nextflow run test.nf -resume
N E X T F L O W ~ version 20.10.0
Launching `test.nf` [grave_albattani] - revision: baea5be781
executor > local (2)
[7a/ec8636] process > A [100%] 1 of 1 ✔
[d8/978a8d] process > B [100%] 1 of 1, cached: 1 ✔
[2d/c2d34c] process > C [100%] 1 of 1 ✔
说了这么多,我仍然不清楚为什么首先需要从工作目录中删除文件。在不知道您要达到什么目的的情况下,我会说避免接触工作目录中的文件,而是使用publishDir 指令来发布您的流程结果,通常使用“复制”模式,即:publishDir './results', mode: 'copy'
。它不适合所有工作流程,但它是一个很好的默认 IMO。然后,如果您出于某种原因想要删除,请从“结果”文件夹中删除您的文件。当工作流程恢复时,Nextflow 将复制任何丢失的文件。这种策略当然会在磁盘上保留两个已发布文件的副本。但是一旦你完成了工作流程,