1

我有一个包含两种方法的图像处理服务,我想使用 Python 中的多处理库并行执行这些方法。

第一种方法执行 api 调用,以便从外部服务获取图像元数据。

第二种方法使用执行某些复杂操作的类的对象,例如使用 opencv 库读取图像以及使用 sklearn 模型执行图像分类活动

第一个函数看起来像这样(如下图)-->

def function_1():
  ##perform long running api call

这是我的第二个功能-->

def function_2(image_proc_obj):
  predictions = image_proc_obj.predict()

在使用multiprocessing.Process调用这两个方法时,如下所示

image_proc_obj = ImageProcessingClass()
p1 = multiprocessing.Process(target=function_1)
p2 = multiprocessing.Process(target=function_2, args=(image_proc_obj,))

我收到一个ValueError:不能腌制包含指针的 ctypes 对象

我在第二个函数中传递了image_proc_obj,因为这个类的构造函数调用加载了模型文件,我不想在每个函数调用中都发生这种情况。

我还尝试通过子类化 multiprocess.Process 以这种方式创建一个类

class ImageClassifier(multiprocess.Process):
   def __init__(self, process_obj):
      super(ImageClassifier,self).__init__()
       self.proc_obj = process_obj


   def run(self, image):
      predictions = self.proc_obj.predict(image)

但是在运行命令时,如下所示:

image_proc_obj = ImageProcessingClass()
classifier = ImageClassifier(name="classifier process", process_obj=image_proc_obj)
classifier.start()
classifier.join()

我得到同样的错误——> ValueError: ctypes objects contains pointers cannot be pickle

期待对此有所帮助

4

1 回答 1

-1

我已经设计并且我仍然成功地使用相同的进程到进程、低延迟优化的通信,使用下面描述的策略,考虑到最小延迟和尽可能短的 TAT,就像做远程 sklearn-- .predict()s 一样,它适用于生产级“远程” [ms]- 对子采样 p2p 请求的预测 - 这已经像魅力一样工作了大约六年。

问: “如何将对象传递给进程......?”

答:
很容易,
由于希望将对象实例传递给另一个独立的进程,因此需要准备原始进程对象的所谓序列化表示。

创建了 SER 序列化/传输/DES 序列化路径后,原始对象数据可能会进入“远程”进程手中。

传输工具可能是 Python-native Queue(对 SER/DES 使用pickle-tool)或任何其他工具(如nanomsgZeroMQ ( pyzmq) pynng、raw-socktes 工具),但这里必须执行 SER/DES- “以编程方式”转换。

pickle.dump()经常失败的地方,可能有机会使用 Mike McKearns 的-pakage dill,刚开始import dill as pickle并且可能仍然会pickle.dump()输入源代码


注意事项:
一旦考虑 OpenCV 有效载荷,请注意,Python 解释器仅指向(引用)OpenCV 本机mat::内存,因此numpy如果尝试移动,最好使用图像数据的“扁平化”重新表示到另一个“远程”过程。

于 2022-01-13T09:12:06.017 回答