日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
了解mutex技術(shù)在數(shù)據(jù)庫(kù)中的應(yīng)用及優(yōu)勢(shì) (mutex 數(shù)據(jù)庫(kù))

在數(shù)據(jù)庫(kù)的應(yīng)用中,嚴(yán)謹(jǐn)?shù)臄?shù)據(jù)管理是成功的關(guān)鍵。數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問控制極其重要,因?yàn)樗梢源_保其中的數(shù)據(jù)完整性、安全性和準(zhǔn)確性。但是,在實(shí)際數(shù)據(jù)庫(kù)系統(tǒng)中,多個(gè)程序或用戶同時(shí)訪問數(shù)據(jù)庫(kù)成為了一個(gè)普遍存在的問題,這也使得數(shù)據(jù)的訪問變得更為復(fù)雜。為了在這種情況下維護(hù)數(shù)據(jù)的安全,數(shù)據(jù)庫(kù)開發(fā)人員使用一種特殊的同步方法,稱為mutex(互斥體)。本文將介紹mutex技術(shù)和其在數(shù)據(jù)庫(kù)中的應(yīng)用及優(yōu)勢(shì)。

成都創(chuàng)新互聯(lián)是專業(yè)的金臺(tái)網(wǎng)站建設(shè)公司,金臺(tái)接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行金臺(tái)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

什么是Mutex技術(shù)?

在計(jì)算機(jī)科學(xué)中,mutex是一種簡(jiǎn)單的同步方法,具有互斥性質(zhì)。在計(jì)算機(jī)體系結(jié)構(gòu)中,當(dāng)多個(gè)線程共享同一個(gè)資源時(shí),互斥體防止多個(gè)線程同時(shí)訪問該資源。通過使用這種同步方法,開發(fā)人員可以防止多個(gè)線程同時(shí)修改共享數(shù)據(jù)。Mutex相當(dāng)于一個(gè)修改屬性,并且只能有一個(gè)線程可以訪問該屬性。當(dāng)訪問者宣布其修改完成時(shí),屬性才可以由其他訪問者訪問。

在數(shù)據(jù)庫(kù)中,mutex的主要作用是確保數(shù)據(jù)的一致性。它控制對(duì)共享數(shù)據(jù)庫(kù)的并發(fā)訪問,這對(duì)于處理同時(shí)進(jìn)行的多用戶操作很有用。即使在數(shù)據(jù)庫(kù)操作的高負(fù)載情況下,mutex技術(shù)也可以確保數(shù)據(jù)安全地更新,而不造成數(shù)據(jù)沖突或丟失。

Mutex在數(shù)據(jù)庫(kù)中的應(yīng)用

在數(shù)據(jù)庫(kù)中,mutex經(jīng)常用于以下幾種情況。

1. 鎖定文件和鎖定數(shù)據(jù)

在數(shù)據(jù)庫(kù)中,互斥體通常用于鎖定文件和數(shù)據(jù),以便某些操作在同一時(shí)刻只能由一個(gè)單獨(dú)的用戶執(zhí)行。在這種情況下,只要互斥體被加鎖,其它的請(qǐng)求方就會(huì)被阻塞,直到互斥體釋放鎖定。這種鎖定技術(shù)為數(shù)據(jù)庫(kù)的多用戶操作提供了非常重要的保證,可以最小化數(shù)據(jù)競(jìng)爭(zhēng)。

2. 管理并發(fā)訪問

多個(gè)用戶訪問同一件事物時(shí),會(huì)引發(fā)并發(fā)訪問的問題。例如,如果一個(gè)顧客在購(gòu)物車中更改了數(shù)量,另一個(gè)顧客嘗試購(gòu)買相同的項(xiàng)目,從而導(dǎo)致數(shù)據(jù)沖突。使用mutex技術(shù),只有一個(gè)線程可以訪問數(shù)據(jù),即使有多個(gè)用戶同時(shí)想要更改數(shù)據(jù)。 mutex方法可以確保只有一個(gè)用戶可以修改數(shù)據(jù)庫(kù)。

3. 避免進(jìn)程間的崩潰

在數(shù)據(jù)庫(kù)中,使用互斥體還可以避免進(jìn)程間的崩潰。如果一個(gè)進(jìn)程在讀取或?qū)懭霐?shù)據(jù)時(shí)意外崩潰,其他線程不會(huì)受到影響,因?yàn)樗信c互斥體有關(guān)的操作都是原子操作?;コ怏w可以幫助保護(hù)數(shù)據(jù)庫(kù),即使在崩潰的情況下,數(shù)據(jù)也不會(huì)丟失。

4. 控制死鎖

死鎖是數(shù)據(jù)庫(kù)中最常見的問題之一。它是指一組正在等待對(duì)方釋放的資源的進(jìn)程,無法向前運(yùn)行。在這種情況下,互斥體可以幫助避免死鎖。通過控制運(yùn)行時(shí)的進(jìn)程操作,可以最小化這種情況,從而提高數(shù)據(jù)庫(kù)的可用性。

Mutex的優(yōu)勢(shì)

使用互斥體提供了許多優(yōu)勢(shì),這些優(yōu)勢(shì)是數(shù)據(jù)庫(kù)管理人員不能忽視的。以下是mutex技術(shù)的幾個(gè)主要優(yōu)勢(shì)。

1. 提高數(shù)據(jù)庫(kù)的安全性

使用互斥體可以提高數(shù)據(jù)庫(kù)的安全性,因?yàn)樗梢苑乐苟鄠€(gè)線程同時(shí)訪問數(shù)據(jù)庫(kù)。在這種情況下,互斥體確保只有一個(gè)用戶可以訪問數(shù)據(jù)庫(kù),以便數(shù)據(jù)能夠正確地更新。這種技術(shù)可以保護(hù)數(shù)據(jù)的安全性和完整性,防止數(shù)據(jù)的修改或泄漏。

2. 提高數(shù)據(jù)庫(kù)的性能

互斥體還可以提高數(shù)據(jù)庫(kù)的性能。通過控制并發(fā)訪問,可以避免性能下降和數(shù)據(jù)沖突。互斥體確保每個(gè)線程在適當(dāng)?shù)臅r(shí)候才能訪問共享數(shù)據(jù)(即同時(shí)),以避免競(jìng)爭(zhēng)和鎖定等問題。這種技術(shù)可以更大限度地提高數(shù)據(jù)庫(kù)的處理速度,并優(yōu)化數(shù)據(jù)庫(kù)操作的整體性能。

3. 簡(jiǎn)化數(shù)據(jù)庫(kù)管理

互斥體技術(shù)還可以簡(jiǎn)化數(shù)據(jù)庫(kù)管理。通過使用這種技術(shù),數(shù)據(jù)庫(kù)管理員可以確保數(shù)據(jù)的一致性,而不必?fù)?dān)心多個(gè)用戶之間的數(shù)據(jù)競(jìng)爭(zhēng)。管理員可以專注于其他數(shù)據(jù)管理任務(wù),而無需擔(dān)心數(shù)據(jù)庫(kù)訪問的一致性問題。

結(jié)論

在實(shí)際的數(shù)據(jù)庫(kù)操作中,mutex技術(shù)成為了確保數(shù)據(jù)安全的一種普遍方法。通過使用互斥體,可以更大程度地提高數(shù)據(jù)庫(kù)的安全性,性能和可靠性。這種技術(shù)可以幫助防止數(shù)據(jù)競(jìng)爭(zhēng)和死鎖等問題,并簡(jiǎn)化數(shù)據(jù)庫(kù)管理。對(duì)于正在處理大量數(shù)據(jù)的組織和企業(yè),應(yīng)該了解和使用這種技術(shù),以確保數(shù)據(jù)的安全性和正確性。

相關(guān)問題拓展閱讀:

  • 深入解析Python中的線程同步方法

深入解析Python中的線程同步方法

深入解析Python中的線程同步方法

同步訪問共享資源

在使用線程的時(shí)候,一個(gè)很重要的問題是要避免多個(gè)線程對(duì)同一變量或其叢陪它資源的訪問沖突。一旦你稍不留神,重疊訪問、在多個(gè)線程中修改(共享資源)等這些操作會(huì)導(dǎo)致各種各樣的問題;更嚴(yán)重的是,這些問題一般只會(huì)在比較極端(比如高并發(fā)、生產(chǎn)服務(wù)器、甚至在性能更好的硬件設(shè)備上)的情況下才會(huì)出現(xiàn)。

比如有這樣一個(gè)情況:需要追蹤對(duì)一事件處理的次卜唯數(shù)

counter = 0

def process_item(item):

global counter

… do something with item …

counter += 1

如果你在多個(gè)線程中同時(shí)調(diào)用這個(gè)函數(shù),你會(huì)發(fā)現(xiàn)counter的值不是那么準(zhǔn)確。在大多數(shù)情況下它是對(duì)的,但有時(shí)它會(huì)比實(shí)際的少幾個(gè)。

出現(xiàn)這種情況的原因是,計(jì)數(shù)增加操作實(shí)際上分三步執(zhí)行:

解釋器獲取counter的當(dāng)前值計(jì)算新值將計(jì)算的新值回寫counter變量

考慮一下這種情況:在當(dāng)前線程獲取到counter值后,另一個(gè)線程搶占到了CPU,然后同樣也獲取到了counter值,并進(jìn)一步將counter值重新計(jì)算并完成回寫;之后時(shí)間片重新輪到當(dāng)前線程(這里僅作標(biāo)識(shí)區(qū)分,并非實(shí)際當(dāng)前),此時(shí)當(dāng)前線程獲取到counter值還是原來的,完成后續(xù)兩步操作后counter的值實(shí)際只加上1。

另一種常見情況是訪問不完整或不一致狀態(tài)。這類情況主要發(fā)生在一個(gè)線程正在初始化或更新數(shù)據(jù)時(shí),另一個(gè)進(jìn)程卻嘗試讀取正在更改的數(shù)據(jù)。

原子操作

實(shí)現(xiàn)對(duì)共享變量或其它資源的同步訪問最簡(jiǎn)單的方法是依靠解釋器的原子操作。原子操作是在一步完成執(zhí)行的操作,在這一步中其它線程無法獲得該共享資源。

通常情況下,這種同步方法只對(duì)那些只由單個(gè)核心數(shù)據(jù)類型組成的共享資源有效,譬如,字符串變量、數(shù)字、列表或者字典等。下面是幾個(gè)線程安全的操作:

讀或者替換一個(gè)實(shí)例屬性讀或者替換一個(gè)全局變量從列表中獲取一項(xiàng)元素原位修改一個(gè)列表(例如:使用append增加一個(gè)列表項(xiàng))從字典中獲取一項(xiàng)元素原位修改一個(gè)字典(例如:增加一個(gè)字典項(xiàng)、調(diào)用clear方法)

注意,上面提到過,對(duì)一個(gè)變量或滲弊蠢者屬性進(jìn)行讀操作,然后修改它,最終將其回寫不是線程安全的。因?yàn)榱硗庖粋€(gè)線程會(huì)在這個(gè)線程讀完卻沒有修改或回寫完成之前更改這個(gè)共享變量/屬性。

鎖是Python的threading模塊提供的最基本的同步機(jī)制。在任一時(shí)刻,一個(gè)鎖對(duì)象可能被一個(gè)線程獲取,或者不被任何線程獲取。如果一個(gè)線程嘗試去獲取一個(gè)已經(jīng)被另一個(gè)線程獲取到的鎖對(duì)象,那么這個(gè)想要獲取鎖對(duì)象的線程只能暫時(shí)終止執(zhí)行直到鎖對(duì)象被另一個(gè)線程釋放掉。

鎖通常被用來實(shí)現(xiàn)對(duì)共享資源的同步訪問。為每一個(gè)共享資源創(chuàng)建一個(gè)Lock對(duì)象,當(dāng)你需要訪問該資源時(shí),調(diào)用acquire方法來獲取鎖對(duì)象(如果其它線程已經(jīng)獲得了該鎖,則當(dāng)前線程需等待其被釋放),待資源訪問完后,再調(diào)用release方法釋放鎖:

lock = Lock()

lock.acquire() #: will block if lock is already held

… access shared resource

lock.release()

注意,即使在訪問共享資源的過程中出錯(cuò)了也應(yīng)該釋放鎖,可以用try-finally來達(dá)到這一目的:

lock.acquire()

try:

… access shared resource

finally:

lock.release() #: release lock, no matter what

在Python 2.5及以后的版本中,你可以使用with語句。在使用鎖的時(shí)候,with語句會(huì)在進(jìn)入語句塊之前自動(dòng)的獲取到該鎖對(duì)象,然后在語句塊執(zhí)行完成后自動(dòng)釋放掉鎖:

from __future__ import with_statement #: 2.5 only

with lock:

… access shared resource

acquire方法帶一個(gè)可選的等待標(biāo)識(shí),它可用于設(shè)定當(dāng)有其它線程占有鎖時(shí)是否阻塞。如果你將其值設(shè)為False,那么acquire方法將不再阻塞,只是如果該鎖被占有時(shí)它會(huì)返回False:

if not lock.acquire(False):

… 鎖資源失敗

else:

try:

… access shared resource

finally:

lock.release()

你可以使用locked方法來檢查一個(gè)鎖對(duì)象是否已被獲取,注意不能用該方法來判斷調(diào)用acquire方法時(shí)是否會(huì)阻塞,因?yàn)樵趌ocked方法調(diào)用完成到下一條語句(比如acquire)執(zhí)行之間該鎖有可能被其它線程占有。

if not lock.locked():

#: 其它線程可能在下一條語句執(zhí)行之前占有了該鎖

lock.acquire() #: 可能會(huì)阻塞

簡(jiǎn)單鎖的缺點(diǎn)

標(biāo)準(zhǔn)的鎖對(duì)象并不關(guān)心當(dāng)前是哪個(gè)線程占有了該鎖;如果該鎖已經(jīng)被占有了,那么任何其它嘗試獲取該鎖的線程都會(huì)被阻塞,即使是占有鎖的這個(gè)線程??紤]一下下面這個(gè)例子:

lock = threading.Lock()

def get_first_part():

lock.acquire()

try:

… 從共享對(duì)象中獲取之一部分?jǐn)?shù)據(jù)

finally:

lock.release()

return data

def get_second_part():

lock.acquire()

try:

… 從共享對(duì)象中獲取第二部分?jǐn)?shù)據(jù)

finally:

lock.release()

return data

示例中,我們有一個(gè)共享資源,有兩個(gè)分別取這個(gè)共享資源之一部分和第二部分的函數(shù)。兩個(gè)訪問函數(shù)都使用了鎖來確保在獲取數(shù)據(jù)時(shí)沒有其它線程修改對(duì)應(yīng)的共享數(shù)據(jù)。

現(xiàn)在,如果我們想添加第三個(gè)函數(shù)來獲取兩個(gè)部分的數(shù)據(jù),我們將會(huì)陷入泥潭。一個(gè)簡(jiǎn)單的方法是依次調(diào)用這兩個(gè)函數(shù),然后返回結(jié)合的結(jié)果:

def get_both_parts():

first = get_first_part()

seconde = get_second_part()

return first, second

這里的問題是,如有某個(gè)線程在兩個(gè)函數(shù)調(diào)用之間修改了共享資源,那么我們最終會(huì)得到不一致的數(shù)據(jù)。最明顯的解決方法是在這個(gè)函數(shù)中也使用lock:

def get_both_parts():

lock.acquire()

try:

first = get_first_part()

seconde = get_second_part()

finally:

lock.release()

return first, second

然而,這是不可行的。里面的兩個(gè)訪問函數(shù)將會(huì)阻塞,因?yàn)橥鈱诱Z句已經(jīng)占有了該鎖。為了解決這個(gè)問題,你可以通過使用標(biāo)記在訪問函數(shù)中讓外層語句釋放鎖,但這樣容易失去控制并導(dǎo)致出錯(cuò)。幸運(yùn)的是,threading模塊包含了一個(gè)更加實(shí)用的鎖實(shí)現(xiàn):re-entrant鎖。

Re-Entrant Locks (RLock)

RLock類是簡(jiǎn)單鎖的另一個(gè)版本,它的特點(diǎn)在于,同一個(gè)鎖對(duì)象只有在被其它的線程占有時(shí)嘗試獲取才會(huì)發(fā)生阻塞;而簡(jiǎn)單鎖在同一個(gè)線程中同時(shí)只能被占有一次。如果當(dāng)前線程已經(jīng)占有了某個(gè)RLock鎖對(duì)象,那么當(dāng)前線程仍能再次獲取到該RLock鎖對(duì)象。

lock = threading.Lock()

lock.acquire()

lock.acquire() #: 這里將會(huì)阻塞

lock = threading.RLock()

lock.acquire()

lock.acquire() #: 這里不會(huì)發(fā)生阻塞

RLock的主要作用是解決嵌套訪問共享資源的問題,就像前面描述的示例。要想解決前面示例中的問題,我們只需要將Lock換為RLock對(duì)象,這樣嵌套調(diào)用也會(huì)OK.

lock = threading.RLock()

def get_first_part():

… see above

def get_second_part():

… see above

def get_both_parts():

… see above

這樣既可以單獨(dú)訪問兩部分?jǐn)?shù)據(jù)也可以一次訪問兩部分?jǐn)?shù)據(jù)而不會(huì)被鎖阻塞或者獲得不一致的數(shù)據(jù)。

注意RLock會(huì)追蹤遞歸層級(jí),因此記得在acquire后進(jìn)行release操作。

Semaphores

信號(hào)量是一個(gè)更高級(jí)的鎖機(jī)制。信號(hào)量?jī)?nèi)部有一個(gè)計(jì)數(shù)器而不像鎖對(duì)象內(nèi)部有鎖標(biāo)識(shí),而且只有當(dāng)占用信號(hào)量的線程數(shù)超過信號(hào)量時(shí)線程才阻塞。這允許了多個(gè)線程可以同時(shí)訪問相同的代碼區(qū)。

semaphore = threading.BoundedSemaphore()

semaphore.acquire() #: counter減小

… 訪問共享資源

semaphore.release() #: counter增大

當(dāng)信號(hào)量被獲取的時(shí)候,計(jì)數(shù)器減?。划?dāng)信號(hào)量被釋放的時(shí)候,計(jì)數(shù)器增大。當(dāng)獲取信號(hào)量的時(shí)候,如果計(jì)數(shù)器值為0,則該進(jìn)程將阻塞。當(dāng)某一信號(hào)量被釋放,counter值增加為1時(shí),被阻塞的線程(如果有的話)中會(huì)有一個(gè)得以繼續(xù)運(yùn)行。

信號(hào)量通常被用來限制對(duì)容量有限的資源的訪問,比如一個(gè)網(wǎng)絡(luò)連接或者數(shù)據(jù)庫(kù)服務(wù)器。在這類場(chǎng)景中,只需要將計(jì)數(shù)器初始化為更大值,信號(hào)量的實(shí)現(xiàn)將為你完成剩下的事情。

max_connections = 10

semaphore = threading.BoundedSemaphore(max_connections)

如果你不傳任何初始化參數(shù),計(jì)數(shù)器的值會(huì)被初始化為1.

Python的threading模塊提供了兩種信號(hào)量實(shí)現(xiàn)。Semaphore類提供了一個(gè)無限大小的信號(hào)量,你可以調(diào)用release任意次來增大計(jì)數(shù)器的值。為了避免錯(cuò)誤出現(xiàn),更好使用BoundedSemaphore類,這樣當(dāng)你調(diào)用release的次數(shù)大于acquire次數(shù)時(shí)程序會(huì)出錯(cuò)提醒。

線程同步

鎖可以用在線程間的同步上。threading模塊包含了一些用于線程間同步的類。

Events

一個(gè)事件是一個(gè)簡(jiǎn)單的同步對(duì)象,事件表示為一個(gè)內(nèi)部標(biāo)識(shí)(internal flag),線程等待這個(gè)標(biāo)識(shí)被其它線程設(shè)定,或者自己設(shè)定、清除這個(gè)標(biāo)識(shí)。

event = threading.Event()

#: 一個(gè)客戶端線程等待flag被設(shè)定

event.wait()

#: 服務(wù)端線程設(shè)置或者清除flag

event.set()

event.clear()

一旦標(biāo)識(shí)被設(shè)定,wait方法就不做任何處理(不會(huì)阻塞),當(dāng)標(biāo)識(shí)被清除時(shí),wait將被阻塞直至其被重新設(shè)定。任意數(shù)量的線程可能會(huì)等待同一個(gè)事件。

Conditions

條件是事件對(duì)象的高級(jí)版本。條件表現(xiàn)為程序中的某種狀態(tài)改變,線程可以等待給定條件或者條件發(fā)生的信號(hào)。

下面是一個(gè)簡(jiǎn)單的生產(chǎn)者/消費(fèi)者實(shí)例。首先你需要?jiǎng)?chuàng)建一個(gè)條件對(duì)象:

#: 表示一個(gè)資源的附屬項(xiàng)

condition = threading.Condition()

生產(chǎn)者線程在通知消費(fèi)者線程有新生成資源之前需要獲得條件:

#: 生產(chǎn)者線程

… 生產(chǎn)資源項(xiàng)

condition.acquire()

… 將資源項(xiàng)添加到資源中

condition.notify() #: 發(fā)出有可用資源的信號(hào)

condition.release()

消費(fèi)者必須獲取條件(以及相關(guān)聯(lián)的鎖),然后嘗試從資源中獲取資源項(xiàng):

#: 消費(fèi)者線程

condition.acquire()

while True:

…從資源中獲取資源項(xiàng)

if item:

break

condition.wait() #: 休眠,直至有新的資源

condition.release()

… 處理資源

wait方法釋放了鎖,然后將當(dāng)前線程阻塞,直到有其它線程調(diào)用了同一條件對(duì)象的notify或者notifyAll方法,然后又重新拿到鎖。如果同時(shí)有多個(gè)線程在等待,那么notify方法只會(huì)喚醒其中的一個(gè)線程,而notifyAll則會(huì)喚醒全部線程。

為了避免在wait方法處阻塞,你可以傳入一個(gè)超時(shí)參數(shù),一個(gè)以秒為單位的浮點(diǎn)數(shù)。如果設(shè)置了超時(shí)參數(shù),wait將會(huì)在指定時(shí)間返回,即使notify沒被調(diào)用。一旦使用了超時(shí),你必須檢查資源來確定發(fā)生了什么。

注意,條件對(duì)象關(guān)聯(lián)著一個(gè)鎖,你必須在訪問條件之前獲取這個(gè)鎖;同樣的,你必須在完成對(duì)條件的訪問時(shí)釋放這個(gè)鎖。在生產(chǎn)代碼中,你應(yīng)該使用try-finally或者with.

可以通過將鎖對(duì)象作為條件構(gòu)造函數(shù)的參數(shù)來讓條件關(guān)聯(lián)一個(gè)已經(jīng)存在的鎖,這可以實(shí)現(xiàn)多個(gè)條件公用一個(gè)資源:

lock = threading.RLock()

condition_1 = threading.Condition(lock)

condition_2 = threading.Condition(lock)

互斥鎖同步

我們先來看一個(gè)例子:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import time, threading

# 假定這是你的銀行存款:

balance = 0

muxlock = threading.Lock()

def change_it(n):

# 先存后取,結(jié)果應(yīng)該為0:

global balance

balance = balance + n

balance = balance – n

def run_thread(n):

# 循環(huán)次數(shù)一旦多起來,最后的數(shù)字就變成非0

for i in range(100000):

change_it(n)

t1 = threading.Thread(target=run_thread, args=(5,))

t2 = threading.Thread(target=run_thread, args=(8,))

t3 = threading.Thread(target=run_thread, args=(9,))

t1.start()

t2.start()

t3.start()

t1.join()

t2.join()

t3.join()

print balance

結(jié)果 :

$ python multhread_threading.py

$ python multhread_threading.py

$ python multhread_threading.py

$ python multhread_threading.py

上面的例子引出了多線程編程的最常見問題:數(shù)據(jù)共享。當(dāng)多個(gè)線程都修改某一個(gè)共享數(shù)據(jù)的時(shí)候,需要進(jìn)行同步控制。

線程同步能夠保證多個(gè)線程安全訪問競(jìng)爭(zhēng)資源,最簡(jiǎn)單的同步機(jī)制是引入互斥鎖?;コ怄i為資源引入一個(gè)狀態(tài):鎖定/非鎖定。某個(gè)線程要更改共享數(shù)據(jù)時(shí),先將其鎖定,此時(shí)資源的狀態(tài)為“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態(tài)變成“非鎖定”,其他的線程才能再次鎖定該資源?;コ怄i保證了每次只有一個(gè)線程進(jìn)行寫入操作,從而保證了多線程情況下數(shù)據(jù)的正確性。

threading模塊中定義了Lock類,可以方便的處理鎖定:

#創(chuàng)建鎖mutex = threading.Lock()

#鎖定mutex.acquire()

#釋放mutex.release()

其中,鎖定方法acquire可以有一個(gè)超時(shí)時(shí)間的可選參數(shù)timeout。如果設(shè)定了timeout,則在超時(shí)后通過返回值可以判斷是否得到了鎖,從而可以進(jìn)行一些其他的處理。

使用互斥鎖實(shí)現(xiàn)上面的例子的代碼如下:

balance = 0

muxlock = threading.Lock()

def change_it(n):

# 獲取鎖,確保只有一個(gè)線程操作這個(gè)數(shù)

muxlock.acquire()

global balance

balance = balance + n

balance = balance – n

# 釋放鎖,給其他被阻塞的線程繼續(xù)操作

muxlock.release()

def run_thread(n):

for i in range(10000):

change_it(n)

加鎖后的結(jié)果,就能確保數(shù)據(jù)正確:

$ python multhread_threading.py

$ python multhread_threading.py

$ python multhread_threading.py

mutex 數(shù)據(jù)庫(kù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于mutex 數(shù)據(jù)庫(kù),了解mutex技術(shù)在數(shù)據(jù)庫(kù)中的應(yīng)用及優(yōu)勢(shì),深入解析Python中的線程同步方法的信息別忘了在本站進(jìn)行查找喔。

成都網(wǎng)站營(yíng)銷推廣找創(chuàng)新互聯(lián),全國(guó)分站站群網(wǎng)站搭建更好做SEO營(yíng)銷。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎(chǔ)服務(wù)商,價(jià)格厚道。提供成都服務(wù)器托管租用、綿陽服務(wù)器租用托管、重慶服務(wù)器托管租用、貴陽服務(wù)器機(jī)房服務(wù)器托管租用。


本文名稱:了解mutex技術(shù)在數(shù)據(jù)庫(kù)中的應(yīng)用及優(yōu)勢(shì) (mutex 數(shù)據(jù)庫(kù))
本文地址:http://www.5511xx.com/article/dpgjieg.html