Блокировка Python не работает

Учитывая следующий код

import time
from multiprocessing import Pool
from threading import Lock
import multiprocessing

PROCESSES = 2
WORKER_CALLS = 2
lock = Lock()

def run(num):
    lock.acquire()
    print("enter"+str(num))
    time.sleep(2)
    print("exit" + str(num))
    lock.release()


if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=PROCESSES)
    pool_outputs = pool.map(run, range(WORKER_CALLS))
    pool.close()
    pool.join()
    print('Pool:', pool_outputs)

Ожидаемый результат, поскольку предположим, что в блокировочной части может находиться только один процесс:

enter0
exit0
enter1
exit1
Pool: [None, None]

но фактический результат:

enter0
enter1
exit0
exit1
Pool: [None, None]

В чем проблема и как ее решить?

Я ничего не знаю о Python, но сначала предполагаю, что Lock работает только между потоками, а не между процессами (и поэтому каждый процесс имеет свой собственный lock).

melpomene 01.06.2018 14:37

@melpomene верна: блокировки обычно используются для защиты доступа к общим данным. Поскольку разные процессы не имеют общих данных (если вы не делаете что-то конкретное), в блокировках также не должно быть необходимости.

yeputons 01.06.2018 14:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
49
1

Ответы 1

Вы не можете заблокировать такие процессы, вы должны использовать multiprocessing.Manager:

Managers provide a way to create data which can be shared between different processes, including sharing over a network between processes running on different machines. A manager object controls a server process which manages shared objects. Other processes can access the shared objects by using proxies.


manager = multiprocessing.Manager()
lock = manager.Lock()

Вместо

lock = Lock()

Другие вопросы по теме