使用Reticulate调用joblib.Parallel时出现Python进程泄漏问题
Reticulate调用joblib.Parallel后残留Python进程及资源泄漏警告问题
问题现象
通过R的reticulate包调用使用joblib.Parallel实现并行计算的Python函数,执行完R脚本后,Python进程会残留。后续这些残留进程被终止时,会触发以下警告:
resource_tracker.py:314: UserWarning: resource_tracker: There appear to be 8 leaked semlock objects to clean up at shutdown resource_tracker.py:314: UserWarning: resource_tracker: There appear to be 1 leaked folder objects to clean up at shutdown
复现步骤
前置依赖
- 安装Python包:
pip install joblib - 安装R包:在R解释器中执行
install.packages('reticulate')
代码文件
foo.R
foo <- reticulate::import("foo") foo$run()
同目录下的foo.py
from joblib import Parallel, delayed def calc(i): return i**2 def run(): res = Parallel(n_jobs=2)(delayed(calc)(i) for i in range(10)) print(res)
执行命令
$ Rscript foo.R
验证方式
直接运行Python脚本调用run()不会出现该问题。由于joblib不会立即终止进程,警告会延迟出现,但可通过以下命令立即查看残留Python进程数量:
ps -a | grep "python" -c
解决方案
在Python函数的Parallel调用后,添加以下代码强制关闭可复用的执行器,避免进程残留:
from joblib.externals.loky import get_reusable_executor get_reusable_executor().shutdown(wait=True)
添加后再次执行R脚本,不会出现资源泄漏警告,也无残留进程。
额外说明
使用VS Code的运行按钮执行R脚本时,无残留进程,也不会触发警告,暂未明确该场景与直接调用Rscript foo.R或source('foo.R')的差异。
内容的提问来源于stack exchange,提问作者T. Kiley
相关产品推荐
相关产品推荐

