六、互斥锁
互斥锁
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。
'''
互斥锁为资源引入一个状态:锁定/非锁定
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变为“非锁定”,其他的线程才能够再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性
'''
'''
多个进程操作同一份数据的时候,会出现数据错乱的问题
针对上述问题,解决方式就是加锁处理:将并发变成串行,牺牲效率从而保证数据的安全
'''
一、Lock()类
threading模块中定义了Lock类,可以方便的处理锁定
- 语法:
from threading import Lock
# 生成一个锁对象
mutex = Lock()
1、acquire()
加锁
- 语法:
from threading import Lock
# 生成一个锁对象
mutex = Lock()
# 加锁操作
mutex.acquire()
'''
加锁操作应该放在该子线程对数据修改操作的代码前,从而实现在该子线程修改数据时,其他进程无法参入修改操作,保证数据的有序
'''
2、release()
释放锁
- 语法:
from threading import Lock
# 生成一个锁对象
mutex = Lock()
# 加锁操作
mutex.acquire()
'''
释放锁操作应该放在子线程对数据修改代码之后,从而能够在该线程对数据修改完毕后,及时释放锁,能让后续其他线程继续对该数据操作
'''
# 释放锁
mutex.release()

浙公网安备 33010602011771号