使用Python joblib Parallel时全局变量的行为机制咨询
使用joblib Parallel时全局变量的访问与修改行为
当使用joblib的Parallel功能并行化函数时,全局变量的访问与修改行为是怎样的?
假设编写了如下代码:
# Global variable client = CustomClass() # Thread level function def runThread(): # modify client variables # call client methods etc # Call the runThread() function using joblib Parallel, 5 threads Parallel(n_jobs=5, backend="multiprocessing")(delayed(runThread) for _ in range(5))
请问创建的全局client对象会有怎样的行为:
- 每个
runThread()函数实例会拥有该全局变量的独立副本,各并行实例可独立修改/访问client? - 所有生成的进程共享同一个client实例,需用互斥锁控制访问?
结论
选择选项1:每个runThread()实例会拥有全局变量的独立副本,可独立修改/访问,互不影响。
原因解析
因为你指定了backend="multiprocessing",joblib会基于多进程实现并行:
- 每个子进程启动时,会复制父进程的内存空间(包括全局变量
client),生成完全独立的副本。 - 子进程对
client的修改只会作用于自己的副本,不会同步到其他进程或父进程的client实例。 - 由于各进程操作的是独立副本,不需要使用互斥锁来控制访问。
补充说明
如果将后端改为backend="threading"(多线程),则所有线程会共享同一个client实例,此时修改操作需要加互斥锁避免竞态条件,但这和你当前的代码配置无关。
内容的提问来源于stack exchange,提问作者Sukrit Kumar
相关产品推荐
相关产品推荐

