用途:为 MATLAB 并行池(parallel pool)的 worker 设置环境与每 worker 状态。默认情况下,进程型 worker 会继承控制客户端的 MATLAB 路径状态,但不会继承已加载的库、打开的连接或昂贵的预计算对象,依赖这些资源的代码需要显式设置。
主要能力与用法:
- 非可序列化资源且需清理(连接、库):parallel.pool.Constant(@buildFcn, @cleanupFcn),在每个 worker 上构造,删除时自动清理。
- 文件数据:parallel.pool.Constant(@() load(file).var),每个 worker 从磁盘加载,客户端不持有数据集。
- 已在客户端内存且跨多个 parfor 循环使用的数据:parallel.pool.Constant(data),池生命周期内只传输一次;单个 parfor 无需使用,交给 MATLAB 自动广播。
- 一次性副作用、无需返回值:parfevalOnAll(pool, @fcn, 0),用 fetchOutputs 暴露错误。
- 路径:可改 parpool 调用时用 parpool(..., AdditionalPaths=paths);池在别处打开时用 parfevalOnAll(pool, @addpath, 0, p),不要删除重建池。
- 环境变量:parpool(..., EnvironmentVariables=vars),先在客户端 setenv;否则用 parfevalOnAll(pool, @setenv, 0, k, v)。
- 数据库连接:优先用 Database Toolbox 的 createConnectionForPool(pool, "MyDataSource", "", ""),返回标准 parallel.pool.Constant。
线程池说明:parallel.pool.Constant 与 parfevalOnAll 同样可用,但线程 worker 共享客户端进程,路径与环境变量改动自动可见,AdditionalPaths 与 EnvironmentVariables 不适用。
限制与注意:避免用 spmd 做 parfor 前的副作用设置——无清理保证、worker 断连会拖垮整个池、Composite 变量无法在 parfor 内直接引用;应改用 parallel.pool.Constant 或 parfevalOnAll。build 函数为惰性初始化,需在 parfor 体内引用 c.Value 才会触发;build 函数所用辅助函数须在 worker 路径上。不要在 parfor 内每次迭代创建资源或 addpath,也不要为改路径/环境变量而删除重建池。
关键函数可用版本:parallel.pool.Constant(R2015b)、parfevalOnAll(R2013b)、parpool AdditionalPaths(R2025a)、EnvironmentVariables(R2017b)、createConnectionForPool(R2019a)。