Учитывая следующий код
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]
В чем проблема и как ее решить?
@melpomene верна: блокировки обычно используются для защиты доступа к общим данным. Поскольку разные процессы не имеют общих данных (если вы не делаете что-то конкретное), в блокировках также не должно быть необходимости.






Вы не можете заблокировать такие процессы, вы должны использовать 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()
Я ничего не знаю о Python, но сначала предполагаю, что
Lockработает только между потоками, а не между процессами (и поэтому каждый процесс имеет свой собственныйlock).