I have a image-processing service containing two methods, which I want to execute in parallel using the multiprocessing library in Python.
The first-method does an api call in order to fetch image metadata from an external service.
The second method uses an object of a class which performs certain complex operations such as reading an image using the opencv library and also performing an image classification activity using a sklearn model
The first function looks like this (as shown below) -->
def function_1():
##perform long running api call
and this is my second function -->
def function_2(image_proc_obj):
predictions = image_proc_obj.predict()
On calling these two methods using multiprocessing.Process as shown below
image_proc_obj = ImageProcessingClass()
p1 = multiprocessing.Process(target=function_1)
p2 = multiprocessing.Process(target=function_2, args=(image_proc_obj,))
I am getting a ValueError: ctypes objects containing pointers cannot be pickled
I am passing the image_proc_obj in the second function because the constructor call of this class loads the model file which I don't want to happen on every function call.
I also tried creating a class in this manner by subclassing 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)
But on running the commands as shown below:
image_proc_obj = ImageProcessingClass()
classifier = ImageClassifier(name="classifier process", process_obj=image_proc_obj)
classifier.start()
classifier.join()
I get the same error --> ValueError: ctypes objects containing pointers cannot be pickled
Looking forward to some help with this