You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:15:03