Python作业

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()
上一篇下一篇

猜你喜欢

热点阅读