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

Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明

 更新時(shí)間:2022年02月24日 10:04:32   作者:雷學(xué)委  
這篇文章主要給大家分享的是Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明,銀行轉(zhuǎn)賬小栗子供大家參考學(xué)習(xí),希望對(duì)你有一定的幫助

這次讓我們來看看一個(gè)真實(shí)場(chǎng)景吧:銀行轉(zhuǎn)賬

一、舉例銀行轉(zhuǎn)賬

假設(shè)現(xiàn)在有一個(gè)xuewei的賬號(hào)里面有 100W。

然后有多個(gè)任務(wù)在轉(zhuǎn)賬,轉(zhuǎn)入轉(zhuǎn)出都是跟這個(gè)xuewei賬號(hào)相關(guān)的。

而且這些任務(wù)發(fā)生是隨機(jī)的。

我們先把上面的場(chǎng)景寫成代碼:

xuewei_account = 100


# amount為負(fù)數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? global xuewei_account
? ? xuewei_account += money

下面是多個(gè)線程,多線程模擬轉(zhuǎn)賬事件,我們假設(shè)有4個(gè)事件在同時(shí)發(fā)生。

import random
import threading
import datetime
import time

xuewei_account = 100


# amount為負(fù)數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? global xuewei_account
? ? xuewei_account += money


# 創(chuàng)建4個(gè)任務(wù)給學(xué)委賬戶轉(zhuǎn)賬
for i in range(10000):
? ? threading.Thread(target=lambda: transfer(-1)).start()
? ? threading.Thread(target=lambda: transfer(1)).start()
? ? threading.Thread(target=lambda: transfer(-1)).start()
? ? threading.Thread(target=lambda: transfer(1)).start()

# 等待活躍線程只剩下主線程MainThread
time.sleep(10)
print("-" * 16)
print("活躍線程數(shù):", threading.active_count())
print("活躍線程:", threading.current_thread().name)
print("學(xué)委賬戶余額:", xuewei_account)

這里啟動(dòng)了4個(gè)線程循環(huán)了10000次,也就是4萬個(gè)線程,分別于學(xué)委的賬戶進(jìn)行轉(zhuǎn)賬。

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

運(yùn)行幾次學(xué)委的賬戶還是正確的,余額還是100W。

上面的代碼線程幾萬個(gè),但每次運(yùn)行的操作都很簡(jiǎn)單,完成一次加法。

線程一個(gè)接一個(gè)start,非??焖倬颓袚Q下一個(gè)線程, 我們看到程序沒有出現(xiàn)問題。

下面進(jìn)行改造,這次不要就4萬線程了,我們讓轉(zhuǎn)賬這個(gè)任務(wù)耗時(shí)更多,每啟動(dòng)一個(gè)線程進(jìn)行模擬10萬次轉(zhuǎn)賬。

import random
import threading
import datetime
import time

xuewei_account = 100


# amount為負(fù)數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? global xuewei_account
? ? for x in range(100000):
? ? ? ? xuewei_account += money

 創(chuàng)建4個(gè)任務(wù)給重復(fù)學(xué)委賬戶轉(zhuǎn)賬:

for i in range(10):
? ? threading.Thread(target=lambda: transfer(-1)).start()
? ? threading.Thread(target=lambda: transfer(1)).start()
? ? threading.Thread(target=lambda: transfer(-1)).start()
? ? threading.Thread(target=lambda: transfer(1)).start()

time.sleep(10)
print("-" * 16)
print("活躍線程數(shù):", threading.active_count())
print("活躍線程:", threading.current_thread().name)
print("學(xué)委賬戶余額:", xuewei_account)

這里運(yùn)行的結(jié)果就比較出乎意料了:

多線程編程復(fù)雜的地方就在這里了, 有時(shí)候明明平平無奇的代碼,改造成多線程,就很容易出bug!

當(dāng)然上面的代碼并不是平平無奇,相比第一段代碼,上面的轉(zhuǎn)賬函數(shù)做的事件更多,更耗時(shí)。

二、問題解決

我們加上鎖。

代碼如下:

import random
import threading
import datetime
import time

xuewei_account = 100

lock = threading.Lock()
# amount為負(fù)數(shù)即是轉(zhuǎn)出金額
def transfer(money):
? ? lock.acquire()
? ? global xuewei_account
? ? for x in range(100000):
? ? ? ? xuewei_account += money
? ? lock.release()


# 創(chuàng)建4個(gè)任務(wù)給重復(fù)學(xué)委賬戶轉(zhuǎn)賬
for i in range(10):
? ? threading.Thread(target=lambda: transfer(-1)).start()
? ? threading.Thread(target=lambda: transfer(1)).start()
? ? threading.Thread(target=lambda: transfer(-1)).start()
? ? threading.Thread(target=lambda: transfer(1)).start()

time.sleep(10)
print("-" * 16)
print("活躍線程數(shù):", threading.active_count())
print("活躍線程:", threading.current_thread().name)
print("學(xué)委賬戶余額:", xuewei_account)

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

上面的代碼不管怎么運(yùn)行,運(yùn)行多少次最后學(xué)委的賬戶都是100.(PS:學(xué)委不會(huì)聯(lián)系讀者轉(zhuǎn)賬的,這個(gè)特別注意)。

不管多少個(gè)線程,每次轉(zhuǎn)賬函數(shù)內(nèi)部轉(zhuǎn)賬的代碼(從global到 += money這一段代碼)只會(huì)被一個(gè)線程調(diào)用。

三、總結(jié)

展示了同步機(jī)制解決一些編程問題的思路。讀者可以多多借鑒,思考鎖的應(yīng)用。

為什么在對(duì)amount重度操作(本文第二段代碼)的時(shí)候,計(jì)算就出錯(cuò)了!

這里amount相當(dāng)于多線程都在操作的變量,也就是共享變量,多線程編程要特別注意這類變量,避免出現(xiàn)對(duì)共享變量的操作,有些程序在并發(fā)規(guī)模很小的時(shí)候一點(diǎn)問題也沒有。

并發(fā)編程是高度利用CPU計(jì)算能力的編程方式,并發(fā)程序也就是在并行執(zhí)行同類任務(wù)的程序。這個(gè)可以跟單線程應(yīng)用比較。

到此這篇關(guān)于Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明的文章就介紹到這了,更多相關(guān)Python線程同步機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中pip安裝庫時(shí)出現(xiàn)Read?timed?out解決辦法

    python中pip安裝庫時(shí)出現(xiàn)Read?timed?out解決辦法

    最近需要使用pip庫,安裝的時(shí)候出現(xiàn)問題,本文就詳細(xì)的介紹一下python中pip安裝庫時(shí)出現(xiàn)Read?timed?out解決辦法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-03-03
  • Python詳細(xì)介紹模型封裝部署流程

    Python詳細(xì)介紹模型封裝部署流程

    本文實(shí)例講述了Python模型封裝部署的原理與實(shí)現(xiàn)方法。封裝即是隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • PHP魔術(shù)方法__ISSET、__UNSET使用實(shí)例

    PHP魔術(shù)方法__ISSET、__UNSET使用實(shí)例

    這篇文章主要介紹了PHP魔術(shù)方法__ISSET、__UNSET使用實(shí)例,本文直接給出代碼示例,需要的朋友可以參考下
    2014-11-11
  • 簡(jiǎn)單掌握Python的Collections模塊中counter結(jié)構(gòu)的用法

    簡(jiǎn)單掌握Python的Collections模塊中counter結(jié)構(gòu)的用法

    counter數(shù)據(jù)結(jié)構(gòu)被用來提供技術(shù)功能,形式類似于Python中內(nèi)置的字典結(jié)構(gòu),這里通過幾個(gè)小例子來簡(jiǎn)單掌握Python的Collections模塊中counter結(jié)構(gòu)的用法:
    2016-07-07
  • 超簡(jiǎn)單的Matplotlib安裝與配置教程

    超簡(jiǎn)單的Matplotlib安裝與配置教程

    Matplotlib是Python的第三方繪圖庫,它非常類似于MATLAB,在使用Matplotlib軟件包之前需要對(duì)其進(jìn)行安裝,這篇文章主要給大家介紹了關(guān)于Matplotlib安裝與配置的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Pycharm學(xué)習(xí)教程(6) Pycharm作為Vim編輯器使用

    Pycharm學(xué)習(xí)教程(6) Pycharm作為Vim編輯器使用

    這篇文章主要為大家詳細(xì)介紹了最全的Pycharm學(xué)習(xí)教程第六篇,Pycharm作為Vim編輯器使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Pandas的數(shù)據(jù)過濾實(shí)現(xiàn)

    Pandas的數(shù)據(jù)過濾實(shí)現(xiàn)

    這篇文章主要介紹了Pandas的數(shù)據(jù)過濾實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • python 實(shí)現(xiàn)控制鼠標(biāo)鍵盤

    python 實(shí)現(xiàn)控制鼠標(biāo)鍵盤

    這篇文章主要介紹了python 控制鼠標(biāo)鍵盤的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • 關(guān)于如何使用python的logging庫

    關(guān)于如何使用python的logging庫

    這篇文章主要介紹了關(guān)于如何使用python的logging庫,logging是Python標(biāo)準(zhǔn)庫中用于記錄日志的模塊。它提供了一種簡(jiǎn)單但靈活的方法來記錄程序中的事件,以便稍后進(jìn)行調(diào)試和分析,需要的朋友可以參考下
    2023-04-04
  • Python文件與文件夾操作大全(非常全面)

    Python文件與文件夾操作大全(非常全面)

    Python具有強(qiáng)大的文件處理功能,如文件的創(chuàng)建、打開、文件內(nèi)容的寫入、讀出文件中的內(nèi)容等等,這篇文章主要介紹了Python文件與文件夾操作,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

二手房| 新郑市| 松江区| 颍上县| 铅山县| 西充县| 康定县| 佛冈县| 子洲县| 滁州市| 兴化市| 古交市| 南安市| 四子王旗| 宽甸| 泸西县| 华坪县| 黔江区| 田阳县| 三明市| 嫩江县| 临泽县| 江陵县| 临朐县| 普陀区| 江北区| 分宜县| 长顺县| 鄂伦春自治旗| 安多县| 伊川县| 博客| 昭苏县| 新蔡县| 南皮县| 大姚县| 通山县| 收藏| 买车| 玛沁县| 涿州市|