使用Python多处理(Pickle错误)并行处理具有不可序列化依赖项的函数的正确方法?
我用multiprocessing的并行映射对一些Python函数进行了并行化,效果很好。但是,现在有些函数依赖于包含无法序列化的本机代码的对象(Pickle错误) 请注意,所有函数,包括具有不可序列化依赖项的函数,都非常适合并行化(在此问题之前,我只是简单地应用了并行映射),唯一的问题是,现在其中一些函数需要加载无法序列化的内存对象 我设想了一些可能的解决方法,但在我看来,所有这些方法要么没有效率,要么很麻烦(在代码可读性和可维护性方面):使用Python多处理(Pickle错误)并行处理具有不可序列化依赖项的函数的正确方法?,python,pickle,python-multiprocessing,Python,Pickle,Python Multiprocessing,我用multiprocessing的并行映射对一些Python函数进行了并行化,效果很好。但是,现在有些函数依赖于包含无法序列化的本机代码的对象(Pickle错误) 请注意,所有函数,包括具有不可序列化依赖项的函数,都非常适合并行化(在此问题之前,我只是简单地应用了并行映射),唯一的问题是,现在其中一些函数需要加载无法序列化的内存对象 我设想了一些可能的解决方法,但在我看来,所有这些方法要么没有效率,要么很麻烦(在代码可读性和可维护性方面): 在函数的每次调用中都加载不可序列化的依赖项(我在\
- 在函数的每次调用中都加载不可序列化的依赖项(我在
方法中加载,然后使类可调用),而不是一次加载它们:低效\uuu init\uuuu()
- 我可以专门为每个具有不可序列化依赖项的函数创建一个进程,然后显式地与它们通信,但是失去了多处理并行映射的便利性
- 或者,也许我可以使用multiprocessing的manager将这些非序列化对象作为全局变量来维护。。。我不知道具体怎么做
class SerializableFunction:
def __init__(param):
self.param = param
def __call__(arg):
if self.param == 'identity':
return arg
return 0
import library # Python binding for a non-python application
class NonSerializableFunction:
def __init__(param, path):
self.param = param
self.non_serializable_dependency = library.load(path) # expensive operation, reads from disk and initializes the object
def __call__(arg):
if self.param == 'identity':
return arg
return self.non_serializable_dependency(arg) # this call is also expensive
在解决这个问题之前,我只是简单地组合函数,然后通过并行映射调用结果函数
处理这个问题的正确方法是什么?谢谢
注意:我使用的一些函数是实际函数,其中一些是可调用对象。为了简单起见,我将它们称为函数。无论如何,请注意,非序列化性不是来自于使用可调用对象,而是来自于加载非序列化依赖项