如何修复多进程中TypeError: cannot pickle 'generator' object错误?
问题:多进程Pool调用时触发"cannot pickle 'generator' object"错误
运行代码时出现以下错误:
TypeError: cannot pickle 'generator' object
原代码:
def postTask(self): arg0 = self.getDistancesModel().getFieldCoordinatesAsTextInWKTEPSG25832() self.__itersList.append(self.getDistancesModel().getNZCCCenterPointsAsString()) self.__itersList.append(self.getDistancesModel().getZCCCenterPointsAsString()) self.__itersList.append(self.getDistancesModel().getNoDataCCenterPointsAsString()) with Pool(processes=self.__processesCount,initializer=self.initPool,initargs=(arg0,)) as DistancesRecordsPool.pool: self.__iterables = self.__yieldIterables() self.__chunkSize = PoolUtils.getChunkSizeForLenOfIterables(lenOfIterablesList=len(self.__itersList),cpuCount=self.__cpuCount) for res in DistancesRecordsPool.pool.map(func=self.run,iterable=self.__iterables,chunksize=self.__chunkSize): self.__res.append(res) DistancesRecordsPool.pool.join() gPostgreSQLHelperObject.closeConnection() return self.__res def __yieldIterables(self): for i in self.__itersList: yield i
解决方法
方法1:直接使用原列表self.__itersList
__yieldIterables()本质就是遍历self.__itersList返回元素,完全没必要额外写生成器方法。把代码里的self.__iterables = self.__yieldIterables()替换成:
self.__iterables = self.__itersList
方法2:将生成器转换为列表
如果一定要保留__yieldIterables()方法,把生成器对象转为可序列化的列表:
self.__iterables = list(self.__yieldIterables())
原因说明
Python的multiprocessing.Pool.map()需要将迭代对象序列化(pickle)后传递给子进程,但生成器属于不可被pickle序列化的对象类型,所以必须换成可序列化的容器(比如列表)来传递数据。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

