python基础一 day40 线程锁 信号量 事件
发布时间:2020-12-20 10:49:33 所属栏目:Python 来源:网络整理
导读:锁: import time from threading import Lock,Thread # Lock 互斥锁 # def func(lock): # global n # lock.acquire() # temp = n # time.sleep(0.2) # n = temp - 1 # lock.release() ## n = 10 # t_lst = [] # lock = Lock() # for i in range(10): # t =
锁: # 科学家吃面 # noodle_lock = Lock() # fork_lock = Lock() # def eat1(name): # noodle_lock.acquire() # print(‘%s拿到面条啦‘%name) # fork_lock.acquire() # print(‘%s拿到叉子了‘%name) # print(‘%s吃面‘%name) # fork_lock.release() # noodle_lock.release() # # def eat2(name): # fork_lock.acquire() # print(‘%s拿到叉子了‘%name) # time.sleep(1) # noodle_lock.acquire() # print(‘%s拿到面条啦‘%name) # print(‘%s吃面‘%name) # noodle_lock.release() # fork_lock.release() # # Thread(target=eat1,args=(‘alex‘,)).start() # Thread(target=eat2,args=(‘Egon‘,)).start() # Thread(target=eat1,args=(‘bossjin‘,args=(‘nezha‘,)).start() from threading import RLock # 递归锁 fork_lock = noodle_lock = RLock() # 一个钥匙串上的两把钥匙 def eat1(name): noodle_lock.acquire() # 一把钥匙 print(‘%s拿到面条啦‘%name) fork_lock.acquire() print(‘%s拿到叉子了‘%name) print(‘%s吃面‘%name) fork_lock.release() noodle_lock.release() def eat2(name): fork_lock.acquire() print(‘%s拿到叉子了‘%name) time.sleep(1) noodle_lock.acquire() print(‘%s拿到面条啦‘%name) print(‘%s吃面‘%name) noodle_lock.release() fork_lock.release() Thread(target=eat1,args=(‘alex‘,)).start() Thread(target=eat2,args=(‘Egon‘,)).start() Thread(target=eat1,args=(‘bossjin‘,args=(‘nezha‘,)).start() 递归锁RLock:在一个线程里可以多次acquire(),解决死锁问题 进程也有死锁问题,当在同一个线程或者同一个进程中,用到两把及以上的互斥锁的时候,容易出现死锁 为什么加锁:全局解释器锁(GIL)是给线程加了锁,是为了避免多个线程同一时间对一个数据进行操作, 但是并不能避免时间片的轮转带来的数据不安全性 lock.acquire()会阻塞 ? 信号量: import time from threading import Semaphore,Thread def func(sem,a,b): sem.acquire() time.sleep(1) print(a+b) sem.release() sem = Semaphore(4) for i in range(10): t = Thread(target=func,args=(sem,i,i+5)) t.start() 事件: # 事件被创建的时候 ? # 数据库 - 文件夹
import time import random from threading import Thread,Event def connect_db(e): count = 0 while count < 3: e.wait(0.5) # 状态为False的时候,我只等待1s就结束 if e.is_set() == True: print(‘连接数据库‘) break else: count += 1 print(‘第%s次连接失败‘%count) else: raise TimeoutError(‘数据库连接超时‘) def check_web(e): time.sleep(random.randint(0,3)) e.set() e = Event() t1 = Thread(target=connect_db,args=(e,)) t2 = Thread(target=check_web,)) t1.start() t2.start() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |