Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python多处理(Pickle错误)并行处理具有不可序列化依赖项的函数的正确方法?_Python_Pickle_Python Multiprocessing - Fatal编程技术网

使用Python多处理(Pickle错误)并行处理具有不可序列化依赖项的函数的正确方法?

使用Python多处理(Pickle错误)并行处理具有不可序列化依赖项的函数的正确方法?,python,pickle,python-multiprocessing,Python,Pickle,Python Multiprocessing,我用multiprocessing的并行映射对一些Python函数进行了并行化,效果很好。但是,现在有些函数依赖于包含无法序列化的本机代码的对象(Pickle错误) 请注意,所有函数,包括具有不可序列化依赖项的函数,都非常适合并行化(在此问题之前,我只是简单地应用了并行映射),唯一的问题是,现在其中一些函数需要加载无法序列化的内存对象 我设想了一些可能的解决方法,但在我看来,所有这些方法要么没有效率,要么很麻烦(在代码可读性和可维护性方面): 在函数的每次调用中都加载不可序列化的依赖项(我在\

我用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

在解决这个问题之前,我只是简单地组合函数,然后通过并行映射调用结果函数

处理这个问题的正确方法是什么?谢谢

注意:我使用的一些函数是实际函数,其中一些是可调用对象。为了简单起见,我将它们称为函数。无论如何,请注意,非序列化性不是来自于使用可调用对象,而是来自于加载非序列化依赖项