新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:python線程安全的兩種情況
1、可見性問題,CPU緩存引起的可見性問題,使線程一對共享變量A的操作無法立即被線程二看到,導(dǎo)致線程二獲得舊值。

2、原子問題。
例如,self._balance=self._balance-draw_amount這個(gè)語句不是原子CPU執(zhí)行命令。這個(gè)語句的執(zhí)行有三個(gè)CPU命令。
實(shí)例
import threading
class Account:
# 定義構(gòu)造函數(shù)
def __init__(self, account_no, balance):
"""
:param account_no: 賬戶
:param balance: 余額
"""
self.account_no = account_no
self._balance = balance
def draw(self, draw_amount):
"""
:param draw_amount: 需要取的錢
:return:
"""
if self._balance > draw_amount:
print(threading.current_thread().getName() + '從' + self.account_no + " 取錢成功,賬戶取出金額是:" + str(
draw_amount) + "\n")
self._balance = self._balance - draw_amount
print('賬戶余額是', self._balance)
else:
print(threading.current_thread().getName() + '從' + self.account_no + " 取錢失敗\n")
# 兩個(gè)線程并發(fā)取錢
account = Account('賬戶一', 2000)
threading.Thread(target=account.draw, name='線程一', args=(800,)).start()
threading.Thread(target=account.draw, name='線程二', args=(800,)).start()
threading.Thread(target=account.draw, name='線程三', args=(800,)).start()
以上就是python線程安全的兩種情況,希望對大家有所幫助。更多Python學(xué)習(xí)指路:創(chuàng)新互聯(lián)Python教程
本文教程操作環(huán)境:windows7系統(tǒng)、Python 3.9.1,DELL G3電腦。
當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)Python教程:python線程安全的兩種情況
地址分享:http://www.dlmjj.cn/article/dhijchc.html


咨詢
建站咨詢
