У меня есть стек изображений.Я пытаюсь использовать многопроцессорность, чтобы выполнить какой-либо процесс для каждого изображения в стеке, чтобы получить новое изображение, а затем заменить старое изображение в стеке.
В process_img
функции я использую метод блокировки, основанный на этот ответ для блокировки output_stack
во избежание одновременной записи различных процессов в output_stack
.
Однако output_stack
, который я пытался записать, всегда является исходным.Пожалуйста, проверьте комментарий в коде тоже.Есть идеи?
import numpy as np
import multiprocessing
from multiprocessing import Pool
class MyClass:
def __init__(self, img_stack):
self.output_stack = np.copy(img_stack)
def init_lock(self, l):
global lock
lock = l
def process_img(self, idx, img):
new_img = do_something(img)
lock.acquire()
print(self.output_stack) # wrong, always original one, even another process succeed updating
self.output_stack[idx] = new_img
print(self.output_stack) # succeed updating
lock.release()
def get_new_img_stack(self)
# ...
l = multiprocessing.Lock()
with Pool(initializer=self.init_lock, initargs=(l,)) as pool:
args = zip(
range(len(img_stack)),
img_stack)
pool.starmap(process_img, args)
return self.output_stack