Python多进程互斥锁原理与实现解析

Hazel
Hazel
发布时间:2026-10-13 | 3人浏览过
原创

本文解析Python多进程中互斥锁的工作原理。由于多进程内存隔离但共享文件系统,并发访问同一资源会导致数据错乱。通过引入互斥锁(Lock),将并发操作转化为串行执行,确保数据一致性,虽牺牲部分效率但避免了竞争错误。

多进程内存隔离与资源竞争问题

在运行多进程时,每个子进程拥有独立的内存空间,彼此之间无法直接共享数据。

互斥锁的工作原理

互斥锁机制

尽管进程间内存隔离,但它们运行于同一操作系统下,共享同一套文件系统。因此,多个进程可以访问同一个文件或打印终端。

这种共享资源的行为会引发竞争,导致输出结果错乱。


#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
from multiprocessing import Process
import time
def task(name):
  print("%s 1" % name)
  time.sleep(1)
  print("%s 2" % name)
  time.sleep(1)
  print("%s 3" % name)
if __name__ == '__main__':
  for i in range(3):
    p = Process(target=task, args=("子进程%s" % i,))
    p.start()
'''
子进程2 1
子进程0 1
子进程1 1
子进程2 2
子进程1 2
子进程0 2
子进程2 3
子进程1 3
子进程0 3
'''

为了解决这一问题,需要引入锁机制进行控制。互斥锁的核心含义是互相排斥,类似于多个人争抢使用同一个卫生间资源。

互斥锁的工作流程是:当某个进程获取到锁(即“抢到卫生间”)后,其他进程必须等待。只有当持有锁的进程完成任务并释放锁后,其他进程才有机会重新争抢锁。

互斥锁的本质是将并发操作转换为串行执行。虽然这降低了运行效率,但有效保证了数据的安全性,避免了数据错乱。

一旦加上互斥锁,并发效果即消失,同一时刻仅有一个进程能够运行。互斥锁通过将并发转为串行来降低效率,从而确保数据正确。

Python中互斥锁的实现方法

解决方案如下:

导入 multiprocessing 模块中的 Lock 类。

程序启动后,所有进程首先尝试获取锁,只有成功获取锁的进程才能继续执行。

当该进程执行完毕并释放锁后,其他进程才能继续争抢锁并执行。


from multiprocessing import Process, Lock
import time
def task(name, mutex):
  # 加锁
  mutex.acquire()
  print("%s 1" % name)
  time.sleep(1)
  print("%s 2" % name)
  time.sleep(1)
  print("%s 3" % name)
  # 把锁拆了
  mutex.release()
if __name__ == '__main__':
  # 建一个对象实例
  mutex = Lock()
  for i in range(3):
    # 把锁传给子进程 让所有子进程用同一把锁
    p = Process(target=task, args=("子进程%s" % i, mutex))
    p.start()
'''
现在程序启动 所有进程首先会去抢锁 只有抢到锁的才能运行
等这个进程运行完了解锁后 再到其他进程继续抢锁
'''
'''
子进程0 1
子进程0 2
子进程0 3
子进程1 1
子进程1 2
子进程1 3
子进程2 1
子进程2 2
子进程2 3
'''

这种机制牺牲了部分运行效率,但确保了数据不会发生错乱。

以上即为本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表