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
相关产品推荐
相关产品推荐

