Matlab删除parpool临时存储文件夹失败,求原因及解决方法
问题描述
通过以下代码创建并行池对象:
c = parcluster(); c.JobStorageLocation = storage_folder; p = gcp('nocreate'); % 若无池,则暂不创建新池。 if isempty(p) parpool(c, num_cores); % 创建并行池 elseif p.NumWorkers ~= num_cores delete(p); % 删除现有池 parpool(c, num_cores); % 创建并行池 end
在脚本末尾执行以下代码删除存储文件夹时:
rmdir(storage_folder, 's');
出现如下错误:
Warning: Error occurred while executing the listener callback for event ObjectBeingDestroyed defined for class parallel.settings.Profile: Invalid or deleted object. Error in parallel.Cluster/handleProfileDeleted (line 439) obj.ProfileObject = parallel.settings.Profile.empty(); Error in parallel.Cluster>@(~,~)obj.handleProfileDeleted() (line 434) @(~, ~) obj.handleProfileDeleted() );
错误原因分析
- 对象引用未释放:创建的
Cluster对象c仍持有对storage_folder的关联引用,删除文件夹时,MATLAB并行模块的配置监听回调(handleProfileDeleted)尝试访问已被删除的存储位置对应的配置对象,触发"无效或已删除对象"的错误。 - 资源占用未清理:即使删除了并行池,MATLAB后台可能仍未完全释放对
storage_folder的文件锁,同时Cluster对象的回调逻辑触发时无法找到依赖的配置文件,导致报错。
解决建议
- 彻底清理并行池与Cluster对象:在删除文件夹前,先销毁并行池并清除
Cluster对象,解除对存储文件夹的引用:% 销毁现有并行池 p = gcp('nocreate'); if ~isempty(p) delete(p); end % 清除Cluster对象,释放关联引用 clear c; % 等待后台完成资源清理(可选,根据实际情况调整等待时长) pause(2); % 执行文件夹删除 rmdir(storage_folder, 's'); - 避免自定义存储位置的即时删除:若非必要场景,优先使用MATLAB默认的临时存储目录,减少手动管理存储文件夹带来的资源冲突问题。
- 确保回调逻辑完成:若必须使用自定义存储,可在删除文件夹前通过
parallel.settings.clear()重置并行配置(谨慎使用,会清除自定义配置),确保所有关联的配置监听回调完成执行。
内容的提问来源于stack exchange,提问作者Imahn
相关产品推荐
相关产品推荐

