七、互斥锁
互斥锁
互斥锁为资源引入一个状态:锁定/非锁定
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变为“非锁定”,其他的线程才能够再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性
'''
多个进程操作同一份数据的时候,会出现数据错乱的问题
针对上述问题,解决方式就是加锁处理:将并发变成串行,牺牲效率从而保证数据的安全
'''
扩展
'''
行锁 表锁
注意:
1.锁不要轻易的使用,容易造成死锁现象(我们写代码一般不会用到,都是内部封装好的)
2.锁只在处理数据的部分加,来保证数据安全(只在争抢数据的环节加锁处理即可)
'''
1、Lock类
multiprocessing模块中定义了Lock类,可以方便的处理锁定
- 语法:
from multiprocessing import Lock
# 生成一个锁对象
mutex = Lock()
1.1 acquire()
加锁
- 语法:
from multiprocessing import Lock
# 生成一个锁对象
mutex = Lock()
# 加锁操作
mutex.acquire()
'''
加锁操作应该放在该子进程对数据修改操作的代码前,从而实现在该子进程修改数据时,其他进程无法参入修改操作,保证数据的有序
'''
1.2 release()
释放锁
- 语法:
from multiprocessing import Lock
# 生成一个锁对象
mutex = Lock()
# 加锁操作
mutex.acquire()
'''
释放锁操作应该放在子进程对数据修改代码之后,从而能够在该进程对数据修改完毕后,及时释放锁,能让后续其他进程继续对该数据操作
'''
# 释放锁
mutex.release()

浙公网安备 33010602011771号