Всегда получать исходное значение после обновления при использовании многопроцессорной обработки и блокировки - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть стек изображений.Я пытаюсь использовать многопроцессорность, чтобы выполнить какой-либо процесс для каждого изображения в стеке, чтобы получить новое изображение, а затем заменить старое изображение в стеке.

В 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
...