六、互斥锁

互斥锁

如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。

使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。

'''
互斥锁为资源引入一个状态:锁定/非锁定

某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变为“非锁定”,其他的线程才能够再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性
'''
'''
多个进程操作同一份数据的时候,会出现数据错乱的问题
针对上述问题,解决方式就是加锁处理:将并发变成串行,牺牲效率从而保证数据的安全
'''

一、Lock()类

threading模块中定义了Lock类,可以方便的处理锁定

  1. 语法:
from threading import Lock

# 生成一个锁对象
mutex = Lock()

1、acquire()

加锁

  1. 语法:
from threading import Lock

# 生成一个锁对象
mutex = Lock()

# 加锁操作
mutex.acquire()

'''
加锁操作应该放在该子线程对数据修改操作的代码前,从而实现在该子线程修改数据时,其他进程无法参入修改操作,保证数据的有序
'''

2、release()

释放锁

  1. 语法:
from threading import Lock

# 生成一个锁对象
mutex = Lock()

# 加锁操作
mutex.acquire()

'''
释放锁操作应该放在子线程对数据修改代码之后,从而能够在该线程对数据修改完毕后,及时释放锁,能让后续其他线程继续对该数据操作
'''

# 释放锁
mutex.release()
posted @ 2021-06-03 21:20  zzwYYYYYY  阅读(143)  评论(0)    收藏  举报