为什么Python multiprocessing的Lock获取后未按预期工作?
问题根因
- 核心原因是
multiprocessing.Lock只会对主动调用lock.acquire()尝试获取锁的进程产生阻塞效果,你代码中执行arg=2逻辑的进程完全没有操作该锁,因此不受锁的约束,两个进程会完全并行执行。
你代码里的执行逻辑是两个进程同时启动:arg=1的进程拿到锁后会睡眠1.1秒再打印hi释放锁,arg=2的进程不受锁限制,会每隔0.5秒打印一次not locked,因此会出现你观察到的实际输出结果。 - 额外的类型标注错误:你代码中导入了
threading.Lock,并给init函数的参数标注了该类型,但实际传入的是multiprocessing.Lock,虽然动态类型的Python运行时不会直接报错,但属于逻辑混淆点,建议修正。
符合预期的修正代码
你如果要实现arg=1的逻辑执行完成后,arg=2的逻辑才开始执行,需要给arg=2的逻辑也加上锁获取逻辑,同时调整死循环逻辑避免无限打印,示例如下:
import multiprocessing import time def target(arg): global lock if arg == 1: lock.acquire() time.sleep(1.1) print('hi') lock.release() elif arg == 2: # 加入锁获取逻辑,等arg=1的进程释放锁后才会继续执行 lock.acquire() print('not locked') lock.release() def init(lock_: multiprocessing.Lock): global lock lock = lock_ if __name__ == '__main__': lock_ = multiprocessing.Lock() with multiprocessing.Pool(initializer=init, initargs=[lock_], processes=2) as pool: pool.map(target, [1, 2])
运行上述代码后输出为:
hi not locked
完全符合你的预期。
内容的提问来源于stack exchange,提问作者Den Avrondo
相关产品推荐
相关产品推荐

