最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python線(xiàn)程之如何解決共享變量問(wèn)題

 更新時(shí)間:2022年02月24日 10:16:16   作者:雷學(xué)委  
這篇文章主要介紹了Python線(xiàn)程之如何解決共享變量問(wèn)題,掐滅問(wèn)我們學(xué)習(xí)了銀行轉(zhuǎn)賬的這個(gè)場(chǎng)景,本文解決上次多個(gè)線(xiàn)程的操作都更改了amount變量導(dǎo)致運(yùn)行結(jié)果不對(duì)的問(wèn)題,需要的朋友可以參考一下

前面提到了銀行轉(zhuǎn)賬這個(gè)場(chǎng)景,展示了一個(gè)比較耗時(shí)的轉(zhuǎn)賬操作。

這篇繼續(xù)轉(zhuǎn)帳,下面展示一段程序,多個(gè)線(xiàn)程的操作都更改了amount變量導(dǎo)致運(yùn)行結(jié)果不對(duì)的問(wèn)題。

前文說(shuō)了轉(zhuǎn)賬問(wèn)題

下面展示另一種轉(zhuǎn)賬的方式:

import random
import threading
import datetime
import time

xuewei = {'balance': 157}


# amount為負(fù)數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? name = threading.current_thread().getName()
? ? print("%s 給xuewei轉(zhuǎn)賬 %s " % (name, money))
? ? xuewei['balance'] += money
? ? print("xuewei賬戶(hù)余額:", xuewei['balance'])


lists = [-7, 20, -20, 7] ?# 4次轉(zhuǎn)賬的數(shù)額,負(fù)數(shù)為學(xué)委的賬戶(hù)轉(zhuǎn)出,正數(shù)為他人轉(zhuǎn)入。
# 創(chuàng)建4個(gè)任務(wù)給學(xué)委轉(zhuǎn)賬上面lists的金額
threads = []
for i in range(4):
? ? amount = lists[i]
? ? name = "t-" + str(i)
? ? print("%s 計(jì)劃轉(zhuǎn)賬 %s" % (name, amount))
? ? mythread = threading.Thread(name=name, target=lambda: transfer(amount))
? ? threads.append(mythread)

# 開(kāi)始轉(zhuǎn)賬
for t in threads:
? ? t.start()

# 等待3秒讓上面的轉(zhuǎn)賬任務(wù)都完成,我們?cè)诳纯促~戶(hù)余額
time.sleep(3)
print("-" * 16)
print("學(xué)委賬戶(hù)余額:", xuewei['balance'])

這里啟動(dòng)了4個(gè)線(xiàn)程,每個(gè)線(xiàn)程內(nèi)有個(gè)lambda表達(dá)式,分別于學(xué)委的賬戶(hù)進(jìn)行轉(zhuǎn)賬,但是最后結(jié)果是185. 而不是157.

下面是運(yùn)行結(jié)果:

PS: 這只是一種運(yùn)行結(jié)果。多線(xiàn)程的運(yùn)行結(jié)果不是永遠(yuǎn)一樣的。

如何解決這個(gè)問(wèn)題?

觀測(cè)結(jié)果我們發(fā)先amount只保留了最后一個(gè)值。

好,下面改造一下:

import random
import threading
import datetime
import time

xuewei = {'balance': 157}

lists = [-7, 20, -20, 7] ?# 4次轉(zhuǎn)賬的數(shù)額,負(fù)數(shù)為學(xué)委的賬戶(hù)轉(zhuǎn)出,正數(shù)為他人轉(zhuǎn)入。


def transfer(amount):
? ? name = threading.current_thread().getName()
? ? print("%s 給xuewei轉(zhuǎn)賬 %s " % (name,amount))
? ? xuewei['balance'] += amount
? ? print("xuewei賬戶(hù)余額:", xuewei['balance'])


# 創(chuàng)建4個(gè)任務(wù)給學(xué)委轉(zhuǎn)賬上面lists的金額
for i in range(4):
? ? amount = lists[i]
? ? name = str(i)
? ? # mythread = threading.Thread(name=name, target=lambda: transfer(amount))
? ? def event():
? ? ? ? print("%s 計(jì)劃轉(zhuǎn)賬 %s" % (name, amount))
? ? ? ? transfer(amount)
? ? mythread = threading.Thread(name=name, target=event)
? ? mythread.start()


# 等待3秒讓上面的轉(zhuǎn)賬任務(wù)都完成,我們?cè)诳纯促~戶(hù)余額
time.sleep(3)
print("-" * 16)
print("學(xué)委賬戶(hù)余額:", xuewei['balance'])

學(xué)委這里加了一個(gè)event函數(shù),把轉(zhuǎn)賬計(jì)劃打印出來(lái)。

從下面的一次運(yùn)行結(jié)果看,event函數(shù)的輸出結(jié)果沒(méi)錯(cuò),所有”計(jì)劃轉(zhuǎn)賬“金額都如預(yù)期[-7, 20, -20 7]。 問(wèn)題是transfer函數(shù)再多線(xiàn)程執(zhí)行的時(shí)候,我們發(fā)現(xiàn)amount被多線(xiàn)程競(jìng)爭(zhēng)修改了:

用戶(hù)0轉(zhuǎn)賬金額變成20
用戶(hù)1轉(zhuǎn)賬金額變成-20
用戶(hù)2轉(zhuǎn)賬金額變成7
用戶(hù)3轉(zhuǎn)賬金額變成7

也就是說(shuō),amount被后面的線(xiàn)程修改了,但是前面線(xiàn)程還沒(méi)有執(zhí)行完。
用戶(hù)0應(yīng)該轉(zhuǎn)賬-7的,中間還沒(méi)有執(zhí)行完畢,結(jié)果被線(xiàn)程1修改了amount為20,用戶(hù)0繼續(xù)執(zhí)行轉(zhuǎn)賬,余額變成177. 其他依次推理。

amount這個(gè)變量被多個(gè)線(xiàn)程競(jìng)爭(zhēng)修改了,這個(gè)就是程序的共享變量。

到底如何解決?

方法非常簡(jiǎn)單:直接干掉共享變量。

下面就是消除共享變量的方法: 讓共享變成每個(gè)線(xiàn)程訪(fǎng)問(wèn)獨(dú)立運(yùn)行空間

所以代碼改動(dòng)如下:

import random
import threading
import datetime
import time

xuewei = {'balance': 157}

lists = [-7, 20, -20, 7] ?# 4次轉(zhuǎn)賬的數(shù)額,負(fù)數(shù)為學(xué)委的賬戶(hù)轉(zhuǎn)出,正數(shù)為他人轉(zhuǎn)入。
# 我們不要依賴(lài)amount變量了
def transfer():
? ? name = threading.current_thread().getName()
? ? xuewei['balance'] += lists[int(name)] #通過(guò)線(xiàn)程名字來(lái)獲取對(duì)應(yīng)金額
? ? print("xuewei賬戶(hù)余額:", xuewei['balance'])

# 創(chuàng)建4個(gè)任務(wù)給學(xué)委轉(zhuǎn)賬上面lists的金額
threads = []
for i in range(4):
? ? amount = lists[i]
? ? name = str(i)
? ? print("%s 計(jì)劃轉(zhuǎn)賬 %s" % (name, amount))
? ? # mythread = threading.Thread(name=name, target=lambda: transfer())
? ? def event():
? ? ? ? transfer()
? ? mythread = threading.Thread(name=name, target=event)
? ? threads.append(mythread)

# 開(kāi)始轉(zhuǎn)賬
for t in threads:
? ? t.start()

# 等待3秒讓上面的轉(zhuǎn)賬任務(wù)都完成,我們?cè)诳纯促~戶(hù)余額
time.sleep(3)
print("-" * 16)
print("學(xué)委賬戶(hù)余額:", xuewei['balance'])

運(yùn)行結(jié)果如下:

上面的代碼不管怎么運(yùn)行,運(yùn)行多少次最后學(xué)委的賬戶(hù)都是157.

這次展示的另一種方式來(lái)避開(kāi)多線(xiàn)程出現(xiàn)bug的方法,使用一個(gè)list下標(biāo)跟線(xiàn)程名字一一對(duì)應(yīng),這樣只要是對(duì)應(yīng)名字的線(xiàn)程拿到的數(shù)值不錯(cuò)錯(cuò)亂。

到此這篇關(guān)于Python線(xiàn)程之如何解決共享變量問(wèn)題的文章就介紹到這了,更多相關(guān)Python線(xiàn)程解決共享變量問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python修改字典鍵(key)的方法

    python修改字典鍵(key)的方法

    在本篇文章里小編給大家整理的是關(guān)于python修改字典鍵(key)的方法以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-08-08
  • 使用PySide多線(xiàn)程處理圖形界面卡頓問(wèn)題詳解

    使用PySide多線(xiàn)程處理圖形界面卡頓問(wèn)題詳解

    這篇文章主要介紹了使用PySide多線(xiàn)程處理圖形界面卡頓問(wèn)題,在制作圖形界面時(shí),只用一個(gè)線(xiàn)程很容易導(dǎo)致卡頓無(wú)響應(yīng),一旦主線(xiàn)程被阻塞,那么整個(gè)圖形界面都會(huì)無(wú)法繼續(xù)使用,為了解決這個(gè)問(wèn)題,就得使用多線(xiàn)程,需要的朋友可以參考下
    2025-04-04
  • Linux下升級(jí)安裝python3.8并配置pip及yum的教程

    Linux下升級(jí)安裝python3.8并配置pip及yum的教程

    這篇文章主要介紹了Linux下升級(jí)安裝python3.8并配置pip及yum的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python2.7實(shí)現(xiàn)復(fù)制大量文件及文件夾資料

    python2.7實(shí)現(xiàn)復(fù)制大量文件及文件夾資料

    這篇文章主要為大家詳細(xì)介紹了python2.7實(shí)現(xiàn)復(fù)制大量文件及文件夾資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法

    Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法

    隊(duì)、棧和鏈表一樣,在數(shù)據(jù)結(jié)構(gòu)中非?;A(chǔ)一種數(shù)據(jù)結(jié)構(gòu),同樣他們也有各種各樣、五花八門(mén)的變形和實(shí)現(xiàn)方式。這篇文章主要介紹了Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法,需要的朋友可以參考下
    2019-07-07
  • python繪制棉棒圖的方法詳解

    python繪制棉棒圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了python繪制棉棒圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Python中dict支持多個(gè)key的方法新家

    Python中dict支持多個(gè)key的方法新家

    在Python中,字典(dict)是一種非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),它允許我們通過(guò)鍵(key)來(lái)存儲(chǔ)和檢索值(value),本文將展示處理包含多個(gè)鍵的字典的方法,希望對(duì)大家有所幫助
    2024-11-11
  • Python異步與定時(shí)任務(wù)提高程序并發(fā)性和定時(shí)執(zhí)行效率

    Python異步與定時(shí)任務(wù)提高程序并發(fā)性和定時(shí)執(zhí)行效率

    Python異步與定時(shí)任務(wù)是Python編程中常用的兩種技術(shù),異步任務(wù)可用于高效處理I/O密集型任務(wù),提高程序并發(fā)性;定時(shí)任務(wù)可用于定時(shí)執(zhí)行計(jì)劃任務(wù),提高程序的執(zhí)行效率。這兩種技術(shù)的應(yīng)用有助于提升Python程序的性能和效率
    2023-05-05
  • Linux上使用Python統(tǒng)計(jì)每天的鍵盤(pán)輸入次數(shù)

    Linux上使用Python統(tǒng)計(jì)每天的鍵盤(pán)輸入次數(shù)

    這篇文章主要介紹了Linux上使用Python統(tǒng)計(jì)每天的鍵盤(pán)輸入次數(shù),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Python三種打包exe方法案例教程

    Python三種打包exe方法案例教程

    這篇文章主要介紹了Python三種打包exe方法案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

瓮安县| 朝阳县| 准格尔旗| 河津市| 阿城市| 库车县| 开封市| 雅安市| 乡宁县| 弥渡县| 辉南县| 建始县| 皮山县| 银川市| 盐山县| 彰武县| 永丰县| 左云县| 香港| 通化县| 五常市| 和硕县| 达州市| 开封县| 福鼎市| 滨海县| 滦南县| 博客| 新竹市| 南靖县| 惠水县| 镇赉县| 红安县| 深泽县| 吉安县| 普兰县| 嵊泗县| 益阳市| 清原| 牟定县| 应城市|