Daemon#

AiiDA 提供了一个在后台运行的守护进程,它处理任何提交的新进程(即计算和 workflow,参见 process concepts )。运行一个进程会阻塞当前的 Python 解释器(关于 runsubmit 的区别,参见 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 交互。