共享内存中动态数组_python 多进程锁Lock和共享内存

本文介绍了Python的multiprocessing模块中进程锁和共享内存的使用。通过示例展示了进程锁如何保证资源的互斥访问,以及如何使用Value和Array实现进程间的共享数据。加锁后,进程按照获取锁的顺序执行,避免了数据竞争。同时,使用join()方法可能导致未调用锁的进程阻塞其他已加锁的进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多进程锁

  • lock = multiprocessing.Lock() 创建一个锁
  • lock.acquire() 获取锁
  • lock.release() 释放锁
  • with lock: 自动获取、释放锁 类似于 with open() as f:

特点:

谁先抢到锁谁先执行,等到该进程执行完成后,其它进程再抢锁执行

当程序不加锁时:

c51de353e9715fa21d40b749edcf33cf.png

运得没有顺序,三个进程交替运行

当程序加锁时

7c9804880b5a615bf3cf2ce5eaba7605.png

只有当其中一个进程执行完成后,其它的进程才会去执行,且谁先抢到锁谁先执行

共享内存

agre = multiproessing.Value(type, value) 创建一个共享内存的变量agre

d639bea6d229efad0fc5a0868ff6f702.png
  • type 声明共享变量agre的类型
  • value 共享变量agre的值
  • agre.value 获取共享变量agre的值

arr = muliproessing.Array(type, values) 创建一个共享内存的数组arr

c9ad940010b62f336ec3df696882abf5.png

例子:

de5794bcb37bbd7a1b2ea65787f204b2.png

先执行进程p3并加锁,p3执行过程中进程p执行,因为p没有调用锁且使用了join()方法,阻塞了其它进程,只有当p执行完成后

p3才会继续执行,p3执行完成后,p1抢到锁并执行

p1、p3 都对共享内存num 进行累加操作,所以num的值一直在增加
p 对 arr 共享数组中的每个值进行了重新赋值的操作,所以当P进程执行完成后,arr数组中的值均发生了变化

由上例可以看出:

1、进程锁只对调用它的进程起锁的作用,未调用该锁的进程不受影响
2、在未调用进程锁的进程中使用 join() 方法会阻塞已调用进程锁的进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值