如今,通常必须在工作流程中同时运行守护程序。例如,深度学习作业需要参数服务器和超参数优化服务器。我在Snakemake中看不到任何明显的受支持方法。
我可以将代码放入Snakefile中,以在工作流启动时启动守护程序,并在退出时将其杀死。我还可以将守护程序定义为一个规则,该规则生成一个daemon.pid文件,并使需要该守护程序的规则依赖于该文件。
但这两个都不是理想的,因为它们确实没有在工作流程中表达守护程序的意图。最重要的是,虽然.pid文件方法可能仅根据需要启动守护程序,但当不再需要它时,它不会将其关闭。
人们如何在工作流程中处理这一问题?
理想情况下,将有一个单独的“守护程序”声明,它将在依赖于该守护程序的第一个规则开始之前启动,并在不再需要任何规则时将其关闭。其他工作流程系统采用这种方法。 Snakemake中有类似的东西吗?
答案 0 :(得分:1)
当然,我从未使用过守护程序,据我了解,我认为您的情况并不特别复杂。
一个选择可能是使用onstart/onsuccess/onerror处理程序。当然,这将在管道的开始处启动守护进程,并在结束时将其停止,这可能是不希望的。
或者,使要求守护程序的第一条规则依赖于daemon.start
。然后,要求守护程序的最后一条规则应触摸daemon.end
文件,该文件触发守护程序的停止。像这样:
rule all:
input:
'foo.txt',
'daemon.end',
rule start_daemon:
output:
touch('daemon.start'),
shell:
r"""
start-daemon
"""
rule do_stuff_with_daemon:
input:
'daemon.start',
output:
'foo.txt',
shell:
r"""
do stuff with daemon
"""
rule stop_daemon:
input:
'foo.txt',
output:
touch('daemon.end'),
shell:
r"""
stop-daemon
"""