能否将pathos与ProcessPoolExecutor结合使用?遇PicklingError求解
解决方案:把concurrent.futures.ProcessPoolExecutor和pathos结合解决PicklingError
没问题,完全可以把concurrent.futures.ProcessPoolExecutor和pathos结合起来解决这个序列化问题!我给你两种实用方案,都能完美适配你的代码习惯:
方案1:直接给ProcessPoolExecutor换上pathos的多进程上下文
你现在的代码结构几乎不用改,只需要让ProcessPoolExecutor使用pathos提供的多进程上下文——它用dill替代了默认的pickle,能序列化更多Python对象。代码示例如下:
import concurrent.futures import pathos.multiprocessing as mp def your_target_function(arg): # 这里可以放原本导致PicklingError的代码,比如调用内置函数、用lambda等 return arg * 2 if __name__ == "__main__": # 关键就是把mp_context参数设为pathos的multiprocessing模块 with concurrent.futures.ProcessPoolExecutor(mp_context=mp) as executor: results = executor.map(your_target_function, [1, 2, 3, 4]) print(list(results))
这样改完之后,你熟悉的executor.map()用法完全保留,同时再也不会遇到那个讨厌的PicklingError了。
方案2:直接用pathos自带的ProcessPool(兼容futures风格)
如果你愿意稍微调整下代码结构,pathos自己的ProcessPool天生支持dill序列化,而且提供了和futures非常接近的接口:
from pathos.pools import ProcessPool def your_target_function(arg): return arg + 1 if __name__ == "__main__": with ProcessPool() as pool: # 和executor.map用法几乎一样的map方法 results = pool.map(your_target_function, [1, 2, 3, 4]) print(list(results)) # 还有类似executor.submit的异步提交方法apipe,返回类Future对象 future_result = pool.apipe(your_target_function, 5) print(future_result.get())
这个方案的好处是不用依赖标准库的concurrent.futures,直接用pathos的原生能力,同样能实现你想要的并行处理效果。
为什么这两种方法能解决问题?
标准库的pickle只能序列化有限的Python对象类型,比如没法处理内置函数、lambda、闭包这些。而pathos依赖的dill库几乎能序列化所有Python对象,刚好补上了这个短板,所以你的PicklingError自然就消失了。
内容的提问来源于stack exchange,提问作者xampione
相关产品推荐
相关产品推荐

