Python 多线程,lock ,rlock,event
1.多个线程对同一个数据进行修改时,要进行加锁
import time import threading summ = 0 def func(): time.sleep(1) global summ l.acquire() #加锁 summ += 1 l.release() #释放锁 print(summ) l = threading.Lock() for i in range(10): t = threading.Thread(target=func) t.start()
2.RLOCK与LOCK区别
import threading # 不能嵌套使用,必须一来一回 lock = threading.Lock() lock.acquire() print('1') # 1 lock.acquire() #会产生死锁,卡在这里 print('2') lock.release() print('3') lock.release() print('over')
#可以嵌套使用,必须锁住多少次,释放多少次,不会产生死锁 rlock = threading.RLock() rlock.acquire() print('1') # 1 rlock.acquire() print('2') # 2 rlock.release() print('3') # 3 rlock.release() print('over') # over
3.Event是线程间通信最间的机制之一:一个线程发送一个event信号,其他的线程则等待这个信号。用于主线程控制其他线程的执行。 Events 管理一个flag,这个flag可以使用 set()设置成True或者使用clear()重置为False,wait()则用于阻塞,在flag为True之前。flag默认为False。
- Event.wait([timeout]) : 堵塞线程,直到Event对象内部标识位被设为True或超时(如果提供了参数timeout)。
- Event.set() :将标识位设为Ture
- Event.clear() : 将标识伴设为False。
- Event.isSet() :判断标识位是否为Ture。
def func(event_obj): print('wait') # print(event_obj.is_set()) # 判断标志位是什么 event_obj.wait() #阻塞线程,直到标志位为True # print(event_obj.is_set()) # 判断标志位是什么 print('excute') event_obj = threading.Event() # 创建一个事件对象 标志位flag 默认为false for i in range(10): t = threading.Thread(target=func,args=(event_obj,)) t.start() event_obj.clear() # 将标志位设置为false inp = input() if inp =='start': event_obj.set() #将标志位设置为True

浙公网安备 33010602011771号