锁机制:类似于事务
一个进程,锁机制完成不了,会变成死锁
做完一件事情前,先锁起来,做完之后再解锁
针对同一个数据,在做是时候希望排他的去做,不希望资源被占用
线程为了避免资源相互征用,所以有一个锁机制,在一件事前先将他所以起来,再做,做完后再释放
锁机制:解决的是一大类问题。资源不允许冲突的去写。
实例化一把锁:
1;锁的一种方式,放入一个list里面
#删除最后一个元素,实际线程的案例,参入了装饰器来记录执行所消耗的时间,
#线程用作万一删除多个,比如3个
import time
import threading
def runtime(func):
def warpper(*args,**kwargs):
starttime=time.time()
func(*args,**kwargs)
endtime=time.time()
print('运行了%d秒'% (endtime-starttime))
return warpper
lock =threading.Lock() #锁机制 做事前现锁起来
lista = [1,2,3,4,5,6,7,8,9]
@runtime #装饰器做的最经典两个事情:1 统计一个事情(这里是记录时间) 2.记录函数运行的日志 附外:3 做权限认证
def pop(listfordel):
lock.acquire() #锁定资源 做之前
#因选取的是list3次选择的都是list的最后一个元素,防止资源冲突,用线程锁,防止冲突
a=listfordel[-1]
print('即将要删除的元素为%s' % a)
time.sleep(3)
listfordel.remove(a)
lock.release() #解锁 做完了
if __name__ =='__main__':
threadlist = []
for i in range(3): #模拟删除3个元素
t=threading.Thread(target=pop,args=(lista,))
threadlist.append(t)
print('线程名为%s' % t.getName()) #getName 获取线程的名字
t.start()
for i in threadlist:
i.join()
print('处理后的lista =%s' % lista)
"""线程名为Thread-1
即将要删除的元素为9
线程名为Thread-2
线程名为Thread-3
即将要删除的元素为8
运行了3秒
即将要删除的元素为7
运行了5秒
运行了8秒
处理后的lista =[1, 2, 3, 4, 5, 6]
"""
import threading
import time
import os
def dosleep():
"""停顿几秒"""
time.sleep(1)
def bookticket(tid):
"""模拟订机票"""
global ticketnumber #模拟票的数量 相当于全局变量
global lock #两行,联系下面的创建锁
while True:
lock.acquire() #得到一个锁,锁定
if ticketnumber !=0:
ticketnumber -= 1 #售票,票数减去!
print('剩下的票为 %s' %{ticketnumber})
dosleep()
else:
print('线程id为 %s,票已经卖完了' % {tid})
os._exit(0) #退出程序
lock.release()
dosleep()
ticketnumber =10
lock =threading.Lock() #创建锁 因为锁是在外面定义的,所以上面的globalyao 要修改
#循环10次
for i in range(10):
newthread = threading.Thread(target=bookticket,args=( i,))
newthread.start()
"""
剩下的票为 {9}
剩下的票为 {8}
剩下的票为 {7}
剩下的票为 {6}
剩下的票为 {5}
剩下的票为 {4}
剩下的票为 {3}
剩下的票为 {2}
剩下的票为 {1}
剩下的票为 {0}
线程id为 {0},票已经卖完了
"""