python多线程解决数据安全问题
在使用多线程处理问题,可能会遇到以下情况,一个车站售卖100张车票,有三个窗口同时售卖,怎么保证票被卖出,该编号票显示已售卖,其他窗口只能售卖其他票,
遇到的问题:发现多线程购买车票时,在每个线程都分别卖出了100张车票
import random
import threading
import time
#创建售卖车票的函数
#创建车票总量
ticket=100
def seal():
#声明全局变量
global ticket
#车票大于0则可以售卖
while ticket>=1:
#显示线程名字,票的余量
print(threading.currentThread().getName().ticket)
#票-1
ticket-=1
#创建三个线程,同时运行seal函数
for i in range(3):
thread=threading.Thread(target=seal,name="线程{0}".format(i+1))
thread.start()
遇到的问题
我们发现同一张票被多个线程售卖
怎么解决这个安全性问题
虽然在售卖票是多线程的,我们只需要保证在处理修改总票数的地方保证每次只能一个线程执行,执行完成之后,才能放下一个线程进来处理即可,我们需要在一开始给程序上锁,等程序结束后,将锁结束,这样就保证,一开始是三个线程一起进来,谁先抢到锁,谁就先执行,执行完成后,解锁,重复刚才步骤,即可解决问题用到的技术
def seal():
global ticket
global lock
time.sleep(random.randint(1,5))
#lock.acquire()
while ticket>0:
#print(threading.active_count())
#获得锁对象
time.sleep(random.randint(1, 3))
lock.acquire()
time.sleep(random.randint(1, 2))
print(threading.currentThread().getName(),ticket)
ticket-=1
if ticket==0:
lock.release()
break
lock.release()
#lock.release()
这边注意,在循环内部,lock.acquire()上锁的意思
lock.release()解锁的意思。
为什么要加等待不同秒数呢,保证不同的线程进入时间不同,防止死锁