Daemon#
AiiDA 提供了一个在后台运行的守护进程,它处理任何提交的新进程(即计算和 workflow,参见 process concepts )。运行一个进程会阻塞当前的 Python 解释器(关于 run 和 submit 的区别,参见 launching 部分),与此不同的是,守护进程可以异步处理多个进程。
AiiDA 中的守护进程概念由多个 系统进程 组成。
备注
这里的 ‘系统进程’ 指的是操作系统运行的进程,而不是 AiiDA 对所有计算和 workflow 的特定统称。
启动守护进程时,后台将启动一个系统进程,该进程将无限期运行,直至停止。该守护进程负责启动并监控一个或多个守护进程 工作者 。每个守护进程 Worker 都是另一个系统进程,它连接到 RabbitMQ 以检索已提交的计算和 workflow,并将其运行至完成。如果守护进程工作者死亡,守护进程将自动恢复。当守护进程被要求停止时,它将向所有 Worker 发送信号以关闭它们,然后再关闭自己。
总结:AiiDA的守护进程由一个在后台运行的系统进程(守护进程)组成,它管理一个或多个系统进程,这些进程处理所有提交的计算和workflow(守护进程工作者)。
客户#
Python API 提供了与守护进程交互的 DaemonClient
类。可以直接为给定的配置文件构建该类,也可以使用 aiida.engine.get_daemon_client()
工具函数来构建该类。为了控制当前默认配置文件的守护进程,可以使用
from aiida.engine import get_daemon_client
client = get_daemon_client()
也可以明确指定一个配置文件:
client = get_daemon_client(profile='some-profile')
守护进程可通过客户端启动和停止:
client.start_daemon()
assert client.is_daemon_running
client.stop_daemon(wait=True)
与守护进程交互的主要方法有
如果守护进程无法启动或调用失败,这些方法将引发 DaemonException
。所有方法都接受 timeout
参数,即在引发 DaemonTimeoutException
之前,客户端应等待守护进程响应的秒数。 timeout
的默认值取自 daemon.timeout
配置选项,并在构建 DaemonClient
时设置。
备注
DaemonClient
只与主守护进程直接交互,而不与其管理的任何守护进程 Worker 交互。