day20總結(jié)(數(shù)據(jù)共享、拷貝)

shareData

import time
from threading import Thread, Lock
from random import randint

多條線程對一個數(shù)據(jù)進行操作的時候,可能會出現(xiàn)數(shù)據(jù)安全/混亂問題。解決問題的方案就對公共的數(shù)據(jù)進行加鎖

1.加鎖的方法
一個公共數(shù)據(jù)對應一個鎖對象
在獲取數(shù)據(jù)前加鎖,數(shù)據(jù)操作完成后解鎖
注意: 加鎖后,加鎖的部分會串行執(zhí)行,但是沒加鎖的代碼還是并行的

class Account:
    """銀行賬號"""
    def __init__(self, name, tel):
        self.name = name
        self.num = '623223147342798347'
        self.balance = 1000
        self.tel = tel
        # 創(chuàng)建鎖對象
        self.lock = Lock()

    def save(self, money):
        """存錢"""
        print('開始存錢')
        # 加鎖
        """
        鎖對象.acquire(timeout=超時時間)
        """
        self.lock.acquire()
        balance = self.balance
        time.sleep(3)
        self.balance = balance + money
        print('存錢結(jié)束,當前余額:', self.balance)
        # 解鎖
        self.lock.release()

    def pay(self, money):
        """取錢"""
        print('開始取錢')
        self.lock.acquire()
        balance = self.balance
        time.sleep(3)
        if balance >= money:
            self.balance = balance - money
        else:
            print('余額不足')
        print('當前余額:', self.balance)
        self.lock.release()


acount = Account('余婷', '15300022703')

# acount.save(1000)
# acount.show()

# acount.pay(500)
# acount.show()

t1 = Thread(target=acount.save, args=(1000,))
t2 = Thread(target=acount.pay, args=(500,))

# t2.start()
# t1.start()
#
#
# t1.join()
# t2.join()
# print(acount.balance)


a = 1000
lock_a = Lock()


def add(num):
    print('網(wǎng)絡請求,獲取數(shù)據(jù)1')
    lock_a.acquire()
    global a
    a1 = a
    time.sleep(3)
    a = a1 + num
    print(a)
    lock_a.release()


def sub(num):
    print('網(wǎng)絡請求,獲取數(shù)據(jù)2')
    lock_a.acquire()
    global a
    a1 = a
    time.sleep(3)
    a = a1 - num
    print(a)
    lock_a.release()


t11 = Thread(target=add, args=(10000,))
t22 = Thread(target=sub, args=(100,))
t11.start()
t22.start()

copy

from copy import copy, deepcopy
  1. 拷貝: 將對象中的內(nèi)容拷貝一份產(chǎn)生一個新的對象。原對象和新對象的地址不同
    列表.copy(), 字典.copy(), 列表[:] --- 淺拷貝

  2. 淺拷貝和深拷貝
    1)淺拷貝
    新對象 = copy(對象)
    創(chuàng)建新的對象,新對象中的內(nèi)容和原對象中的內(nèi)容的地址一樣(直接拷貝, 地址也是直接賦值)

新對象 = deepcopy(對象)
創(chuàng)建新的對象,原對象中的內(nèi)容也會拷貝一份產(chǎn)生新的地址, 最終保存新的地址
(不是直接拷貝,地址不是直接賦值,而是拷貝地址對應的對象產(chǎn)生新的地址)

list1 = [1, 2, [3, 4]]
list2 = copy(list1)
print(list1, list2)
print(id(list1), id(list2))


class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return str(self.__dict__)


class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        self.dog = None

    def __repr__(self):
        return str(self.__dict__)


p1 = Person('小明', 18, '男')
p1.dog = Dog('大黃', 3)

p2 = deepcopy(p1)
p2.name = '小紅'
p2.dog.age = 4

print(p1, p2)

# 淺拷貝和深拷貝
list1 = [1, 2]
list11 = [0, 1, list1]
list22 = copy(list11)
list33 = deepcopy(list11)

list11[2].append(100)
print(list22, list1)
print(list33)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,631評論 1 32
  • 307、setValue:forKey和setObject:forKey的區(qū)別是什么? 答:1, setObjec...
    AlanGe閱讀 1,710評論 0 1
  • 1.設計模式是什么? 你知道哪些設計模式,并簡要敘述?設計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,296評論 0 12
  • 【Day41 orange】 此時已經(jīng)是下午,黃原河被西斜的太陽照耀得一片金光燦爛。河西大片的樓房已經(jīng)沉浸在...
    王橘子啦閱讀 951評論 0 0
  • 1.感恩我慈愛的天父上帝護佑我度過平安,喜樂,幸福的一天!我在父的臂彎里像個小公主一樣的快樂,父愛我比我自己還多的...
    yf永不言棄閱讀 173評論 0 0

友情鏈接更多精彩內(nèi)容