You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dask SSHCluster中以编程方式禁用nanny进程?

解决Dask SSHCluster中守护进程无法创建子进程的问题

问题背景

使用多主机Dask SSHCluster时,单主机启动多个Worker会导致内存占用过高甚至崩溃。尝试改为每个主机启动1个Worker,并在Worker内使用multiprocessing池:

manager = mp.Manager()
pool = mp.Pool()

或使用Dask Distributed的processes调度器:

delayed_values = [delayed(worker)(param) for param in params]
futures = compute(delayed_values, scheduler="processes", num_processes=n_processes)

均触发以下错误:

AssertionError: daemonic processes are not allowed to have children

问题根源是Dask默认通过Nanny进程管理Worker,Nanny创建的Worker是守护进程,而守护进程无法创建子进程。已知通过--no-nanny参数可以禁用Nanny,但需要代码层面的实现方式。

解决方案

在创建SSHCluster时,直接在worker_options中添加"nanny": False参数,即可禁用Nanny进程。

修改后的完整代码示例:

cluster = SSHCluster(
    ["localhost", "hostname"],
    connect_options={"known_hosts": None},
    worker_options={
        "n_workers": 1,  # 每个主机仅启动1个Worker
        "nanny": False   # 禁用Nanny进程
    },
    scheduler_options={"port": 0, "dashboard_address": ":8797"},
)

client = Client(cluster)

说明

禁用Nanny后,Worker进程不再是守护进程,此时就可以在Worker内部安全地创建multiprocessing子进程,或使用processes调度器执行任务,不会再触发守护进程相关的断言错误。

内容的提问来源于stack exchange,提问作者Jurgen Cuschieri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:16:07