我需要找到一种方法让 python 进程确定它是否作为多处理池的一部分启动。
我正在使用
dask
来并行计算,使用 dask.distributed.LocalCluster
。出于用户体验的原因(这用作专门科学任务的库的一部分),我希望 dask 集群设置发生在用户可以导入的模块中。
这意味着我不能使用通常的防护:
import dask.distributed as dd
if __name__=='__main__':
dd.LocalCluster()
防止子进程启动自己的集群,因为我需要从本身导入的模块中启动集群。
通过深入研究
psutil
方法,我发现子进程是使用 --multiprocessing-fork
命令行选项调用的,并且它们运行 multiprocessing.spawn.spawn_main
方法。我正在考虑检查 --multiprocessing-fork
标志是否存在,以了解当前进程是否是池的一部分。
这是正确的做法吗?有更好的办法吗?我找不到任何关于 multiprocessing.spawn.spawn_main 方法的明显文档。
非常感谢!
我能想到的最简单的事情就是查看
distributed.worker.Worker._instances
是否有任何条目。工作子进程应该始终有这个。这本质上就是 distributed.get_worker()
所做的,如果不在工作线程上运行,则会引发 ValueError。