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
拷貝: 將對象中的內(nèi)容拷貝一份產(chǎn)生一個新的對象。原對象和新對象的地址不同
列表.copy(), 字典.copy(), 列表[:] --- 淺拷貝淺拷貝和深拷貝
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)