многопроцессорная обработка - get_lock vs Lock - PullRequest
0 голосов
/ 06 ноября 2018

При поиске информации об общих многопроцессорных переменных я заметил, что существует два способа обновления общей многопроцессорной переменной:

# Our shared variable
total_uploaded_files = multiprocessing.Value('I', 0)
lock = multiprocessing.Lock()

# Method A
def my_multiprocessing_worker():
    global total_uploaded_files
    # do stuff ...
    with total_uploaded_files.get_lock():
        # increment shared counter
        total_uploaded_files.value += 1

# Method B
def my_multiprocessing_worker():
    global total_uploaded_files, lock
    # do stuff ...
    with lock:
        # increment shared counter
        total_uploaded_files.value += 1

Каковы различия и какой метод следует предпочесть, например, для реализации многопроцессорных счетчиков.

Спасибо

1 Ответ

0 голосов
/ 06 ноября 2018

Использование get_lock() метода multiprocessing.Value означает, что коду, использующему объект, не нужно заботиться об источнике Lock (поскольку он мог быть создан автоматически или был передан явно, когда Value экземпляр создан).

С другой стороны, некоторые могут утверждать, что метод B является более явным, и поэтому считают его лучшим подходом.

Чтобы еще больше запутать, рассмотрим еще одну "гибридную" возможность:

from contextlib import contextmanager

# Method C
@contextmanager
def locked(value):
    with value.get_lock():
        yield

def my_multiprocessing_worker():
    global total_uploaded_files
    # do stuff ...
    with locked(total_uploaded_files):
        # increment shared counter
        total_uploaded_files.value += 1

Итак, на мой взгляд, суть в том, что в конечном итоге это просто вопрос выбора и предпочтительный стиль программирования ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...