请问Python的multiprocessing.Lock是否具备线程安全性?
multiprocessing.Lock 是否具备线程安全性?
- 结论:
multiprocessing.Lock不是为线程间同步设计的,不具备线程安全性,绝对不能用它来保护同一进程内多线程的共享资源。 - 核心原因:
multiprocessing.Lock基于操作系统级的进程同步原语(比如POSIX互斥锁或Windows临界区),这类原语的设计目标是实现跨进程的互斥,而非同一进程内的线程互斥。- 在部分平台上,同一进程内的多个线程调用
multiprocessing.Lock的acquire()和release()时,可能无法正确触发线程阻塞,进而引发数据竞争、死锁等问题。
- 正确替代方案: 同一进程内的线程同步,直接用
threading.Lock——它是专门为线程安全打造的轻量级同步工具,能可靠保障线程间的互斥逻辑。
举个直观的反例:
from multiprocessing import Lock import threading lock = Lock() counter = 0 def increment(): global counter for _ in range(100000): lock.acquire() counter += 1 lock.release() threads = [threading.Thread(target=increment) for _ in range(4)] for t in threads: t.start() for t in threads: t.join() print(counter) # 结果大概率小于400000,证明存在线程安全漏洞
如果把multiprocessing.Lock替换成threading.Lock,最终输出会稳定等于400000。
内容的提问来源于stack exchange,提问作者Burakhan Aksoy
相关产品推荐
相关产品推荐

