给定以下代码
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]
问题是什么以及如何解决这个问题?
你不能像这样锁定进程,你必须使用multiprocessing.Manager
:
管理器提供了一种创建可在其之间共享的数据的方法 不同的过程,包括通过网络共享 在不同计算机上运行的进程。管理器对象控制 管理共享对象的服务器进程。其他工艺可以 使用代理访问共享对象。
manager = multiprocessing.Manager()
lock = manager.Lock()
而不是
lock = Lock()