python多线程解决数据安全问题

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()解锁的意思。
为什么要加等待不同秒数呢,保证不同的线程进入时间不同,防止死锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值