python 多程序程式設計(二) 程序鎖 訊號量

2021-10-10 14:45:22 字數 3442 閱讀 3370

我們有時候會遇到這樣的情況,當有100個執行緒同時去操作乙個檔案或者修改乙個資料的時候,會發生什麼呢?

我們來看一下下面的例子

from time import sleep

from threading import thread

class

account

(object):

def__init__

(self)

: self._balance =

0def

deposit

(self, money)

:# 計算存款後的餘額

new_balance = self._balance + money

# 模擬受理存款業務需要0.01秒的時間

sleep(

0.01

)# 修改賬戶餘額

self._balance = new_balance

@property

defbalance

(self)

:return self._balance

class

addmoneythread

(thread)

:def

__init__

(self, account, money)

:super()

.__init__(

) self._account = account

self._money = money

defrun(self)

: self._account.deposit(self._money)

defmain()

: account = account(

) threads =

# 建立100個存款的執行緒向同乙個賬戶中存錢

for _ in

range

(100):

t = addmoneythread(account,1)

t.start(

)# 等所有存款的執行緒都執行完畢

for t in threads:

t.join(

)print

('賬戶餘額為: ¥%d元'

% account.balance)

if __name__ ==

'__main__'

: main(

)

我們創造了100個執行緒來對餘額進行了加一塊錢的操作,按道理我們最後的結果應該是100元,但是輸出的結果竟然還是1塊,如果這是發生在銀行卡上的操作,那將是絕對不允許的。

產生的原因是因為這100個執行緒幾乎是同是啟動的,那麼它們拿到的初始資料肯定都是0,那麼加1後返還,那必定是1塊了。

那我們解決這個問題的最佳方法就是,加上程序鎖或者是執行緒鎖,在乙個執行緒對資料進行操作的時候,其餘執行緒會堵塞,直到上乙個執行緒執行完畢,下乙個執行緒才能繼續進行操作。雖然這會降低程式執行的效率,但在這種情況下,資料的一致性的優先順序是最高的

from time import sleep

from threading import thread, lock

class

account

(object):

def__init__

(self)

: self._balance =

0 self._lock = lock(

)def

deposit

(self, money)

:# 先獲取鎖才能執行後續的**

self._lock.acquire(

)try

: new_balance = self._balance + money

sleep(

0.01

) self._balance = new_balance

finally

:# 在finally中執行釋放鎖的操作保證正常異常鎖都能釋放

self._lock.release(

) @property

defbalance

(self)

:return self._balance

class

addmoneythread

(thread)

:def

__init__

(self, account, money)

:super()

.__init__(

) self._account = account

self._money = money

defrun(self)

: self._account.deposit(self._money)

defmain()

: account = account(

) threads =

for _ in

range

(100):

t = addmoneythread(account,1)

t.start(

)for t in threads:

t.join(

)print

('賬戶餘額為: ¥%d元'

% account.balance)

if __name__ ==

'__main__'

: main(

)

訊號量最直觀的解釋同一時間一段****能被多少子程序執行的數量,如果一段**能同時被四個子程序執行,那麼訊號量就是4。這個訊號量的實現也是基於程序鎖的原理,程序鎖是一把鎖,而訊號量的實現類似於分配若干程序鎖來實現。

import random

from multiprocessing import process,semaphore

import time

defmovie

(name,sem)

: sem.acquire(

)#獲取程序鎖

print

("%s is watching movie"

%name)

time.sleep(random.randint(1,

4))print

("%s exit"

%name)

sem.release(

)if __name__ ==

'__main__'

: sem = semaphore(4)

#設定四把程序鎖

for i in

range(8

):p = process(target=movie,args=

(i,sem)

) p.start(

)

python多程序 Python多程序程式設計詳解

本文 在 python 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...

python 多程序程式設計

多程序指的是乙個程式可以啟動多個程序執行,一般模式如下 import multiprocessing from multiprocessing import process,current process import time cup 核數量 num cpus multiprocessing.cp...

python多程序程式設計

python多程序程式設計。最近開始學習python程式語言,詳細參照 python絕技運用python成為頂級黑客 在學習過程第一章節中,編寫破解linux shadow檔案時,想利用多執行緒加快破解速度。主機執行環境為windows下的vm workstation上的一台虛擬機器,執行多執行緒 ...