當有兩個或跟多個執行緒或程序需要操作乙個變數或程序時,會出現意想不到的結果,這是因為執行緒或程序時迸發進行的,對同意變數或檔案操作時,會出現同時對其操作,從到導致邏輯錯誤。#!/bin/usr/env python
#coding:utf-8
import multiprocessing
import time
class multf(multiprocessing.process):
"""docstring for multf"""
def __init__(self,filename,proname,stime):
multiprocessing.process.__init__(self)
self.filename = filename
self.proname = proname
self.stime = stime
def run(self):
with open(self.filename,'a') as f:
for x in xrange(1,5):
f.write("程序編號:"+str(self.proname)+"---"+str(x)+'\n')
time.sleep(self.stime)
f.close()
print u"檔案寫入完成."
def main():
filename = './test.txt'
t1 = multf(filename,'01',2)
t2 = multf(filename,'02',1)
t3 = multf(filename,'03',2)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print u"結束"
if __name__ == '__main__':
main()
為解決以上問題我們需要引入鎖。
鎖有兩種狀態:被鎖(locked)和沒有被鎖(unlocked)。擁有acquire()和release()兩種方法,並且遵循以下的規則:如果乙個鎖的狀態是unlocked,呼叫acquire()方法改變它的狀態為locked;
如果乙個鎖的狀態是locked,acquire()將會阻塞,直到另乙個執行緒或程序呼叫release()方法釋放它;
如果乙個鎖的狀態是unlocked,呼叫release()會丟擲runtimeerror異常;
如果乙個鎖的狀態是locked,呼叫release()方法改變它的狀態wieunlocked。
解決上面兩個程序或執行緒同時寫乙個檔案的問題的方法就是:我們給寫檔案的類的構造器中傳入乙個鎖(lock),使用這個鎖來保護檔案操作,實現在給定的時間只有乙個執行緒寫檔案。#!/bin/usr/env python
#coding:utf-8
import multiprocessing
import time
class multf(multiprocessing.process):
"""docstring for multf"""
def __init__(self,filename,proname,stime,lock):
multiprocessing.process.__init__(self)
self.filename = filename
self.proname = proname
self.stime = stime
self.lock = lock
def run(self):
with open(self.filename,'a') as f:
self.lock.acquire()
for x in xrange(1,5):
f.write("程序編號:"+str(self.proname)+"---"+str(x)+'\n')
time.sleep(self.stime)
f.close()
self.lock.release()
print u"檔案寫入完成."
def main():
filename = './test2.txt'
lock = multiprocessing.lock()
t1 = multf(filename,'01',2, lock)
t2 = multf(filename,'02',1,lock)
t3 = multf(filename,'03',2,lock)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print u"結束"
if __name__ == '__main__':
main()
python鎖機制 python的鎖機制
鎖 lock lock 指令鎖 是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態 鎖定和非鎖定,以及兩個基本的方法。可以認為lock有乙個鎖定池,當執行緒請求鎖定時,將執行緒至於池中,直到獲得鎖定後出池。池中的執行緒處於狀態圖中的同步阻塞狀態。構造方法 l...
python鎖機制 Python高階之多執行緒鎖機制
1.多程序的優勢 為了同步完成多項任務,通過提高資源使用效率來提高系統的效率。2.檢視執行緒數 threading.enumerate 函式便可以看到當前執行緒的數量。3.檢視當前執行緒的名字 threading.current thread 可以看到當前執行緒的資訊。4.類可以繼承 threadi...
python多執行緒鎖機制
在多執行緒程式設計中常用到的乙個概念就是鎖,它用於將執行緒需要獨佔的資源進行加鎖,使用後再進行釋放,防止死鎖發生。此處給出乙個不加鎖的多執行緒例子 實現整數n在每個執行緒內加1並列印 usr bin python coding utf 8 import threading import time c...