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

Python 3.9在Windows 10下multiprocessing.RLock使用正确性咨询

关于multiprocessing.RLock的使用问题

环境:Python 3.9、Windows 10

我的代码如下:

from multiprocessing import Process, RLock
import os

LOCK = RLock()

def acquire_lock():
    r = LOCK.acquire()
    print(os.getpid(), "lock acquired:", r)

if __name__ == "__main__":
    acquire_lock()

    process1 = Process(target=acquire_lock)
    process1.start()

    process2 = Process(target=acquire_lock)
    process2.start()

    process1.join()
    process2.join()

我原本预期只会打印一行内容且程序不会退出,但实际打印了三行,且程序直接退出:

C:\workspace\nap\nap_test\validator>\apps\Python39\python.exe .\rlock.py
36660 lock acquired: True
20624 lock acquired: True
36792 lock acquired: True

C:\workspace\nap\nap_test\validator>

将RLock替换为Lock后结果一致。请问上述代码中multiprocessing.RLock的使用是否正确?


你的用法不正确,核心问题出在多进程间锁的共享逻辑上:

  • 多进程模式下,每个子进程会复制父进程的内存空间,包括全局变量LOCK。这意味着主进程和两个子进程各自持有独立的锁实例,彼此的锁状态完全不互通。所以每个进程调用acquire()都能成功获取自己的那把锁,自然会打印三行,且不会出现阻塞。

  • 不管是Lock还是RLock,要在多进程间实现同步,必须使用跨进程共享的锁对象。常见的正确方式有两种:一是通过multiprocessing.Manager()创建可跨进程共享的锁;二是将锁作为参数传递给子进程,而不是依赖全局变量复制。

举个符合你预期的正确示例:

from multiprocessing import Process, RLock, Manager
import os

def acquire_lock(lock):
    r = lock.acquire()
    print(os.getpid(), "lock acquired:", r)
    # 不释放锁,后续进程会持续阻塞,符合你原本的预期
    # lock.release()

if __name__ == "__main__":
    with Manager() as manager:
        lock = manager.RLock()
        acquire_lock(lock)

        process1 = Process(target=acquire_lock, args=(lock,))
        process1.start()

        process2 = Process(target=acquire_lock, args=(lock,))
        process2.start()

        process1.join()
        process2.join()

这个示例中,通过Manager创建的锁是跨进程共享的,主进程获取锁后不释放,子进程会一直阻塞,只会打印第一行内容,程序也不会退出。

内容的提问来源于stack exchange,提问作者H.Sheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:40:04