Day20 数据安全
2019-08-19 本文已影响0人
风月辞寒
一.线程间数据共享
数据的存储跟线程无关; 一个进程中的数据在多个线程中可以直接用
情况1: 在子线程中使用主线程中的数据
list1 = [10, 20, 30]
def func1():
list1.append(100)
def func2():
list1[0] = 'hello'
t1 = Thread(target=func1)
t2 = Thread(target=func2)
t1.start()
t2.start()
t1.join()
t2.join()
print(list1)
情况2: 在子线程中使用子线程中的数据
list1 = [10, 20, 30]
def func1():
global list1
list1 = [1, 2, 3]
def func2():
t = Thread(target=func1)
t.start()
print(list1)
t1 = Thread(target=func2)
t1.start()
二.数据共享安全问题以及锁的使用
获取锁对象
获取数据
操作完成后
释放锁对象
注意: 使用锁的时候保证一个数据对应一把锁
from time import sleep
from threading import Thread, Lock
class Account:
"""银行账号"""
_card_num = 0
def __init__(self, name, tel, balance, bank='建设银行'):
self.bank = bank
self._card_num += 1
self.name = name
self.tel = tel
self.balance = balance
self.lock = Lock() # 1.创建锁
def save_money(self, amount):
# 获取余额
print('=========开始存钱!============')
# 2.使用锁
self.lock.acquire()
# 存钱
bl = self.balance
print('余额:%s' % bl)
sleep(4)
self.balance += amount
# 3.释放锁
self.lock.release()
print('存钱:{}, 余额:{}'.format(amount, self.balance))
print('========存钱结束!==========')
def draw_money(self, amount):
print('=======开始取钱!=========')
self.lock.acquire()
bl = self.balance
print('余额:%s' % bl)
sleep(10)
if bl < amount:
print('余额不足!!!')
print('======取钱结束======')
return
self.balance -= amount
self.lock.release()
print('取钱:{}, 余额:{}'.format(amount, self.balance))
print('========取钱结束========')
account = Account('xh', '12345', 10)
t1 = Thread(target=account.save_money, args=(5,))
t2 = Thread(target=account.draw_money, args=(5,))
t1.start()
t2.start()