我們有時候會遇到這樣的情況,當有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上的一台虛擬機器,執行多執行緒 ...