當我們用多程序來讀寫檔案的時候,如果乙個程序是寫檔案,乙個程序是讀檔案,如果兩個檔案同時進行,肯定是不行的,必須是檔案寫結束以後,才可以進行讀操作。或者是多個程序在共享一些資源的時候,同時只能有乙個程序進行訪問,那就要有乙個鎖機制進行控制。
需求:
乙個程序寫入乙個檔案,乙個程序追加檔案,乙個程序讀檔案,同時啟動起來
我們可以通過程序的join()方法來實現,但是為了學習lock,用lock來實現。
先看不加鎖程式,在看加鎖程式,最後比較兩個程式的區別
不加鎖:
結果:import multiprocessing
import time
#lock = multiprocessing.lock()
# #獲得鎖
# lock.acquire()
# #釋放鎖
# lock.release()
#with
lock 能自動釋放鎖
def add(number,value,lock):
# with
lock:
print ("int add number =".format(value,number))
for i in xrange(5):
number +=value
time.sleep(1)
print ("add number =".format(value,number))
if __name__ == '__main__':
lock = multiprocessing.lock()
number = 0
p1 = multiprocessing.process(target=add,args=(number,1,lock))
p2 = multiprocessing.process(target=add,args=(number,3,lock))
p1.start()
p2.start()
print("main end")
main end
int add1 number =0
int add3 number =0
add1 number =1
add3 number =3
add1 number =2
add3 number =6
add1 number =3
add3 number =9
add1 number =4
add3 number =12
add1 number =5
add3 number =15
加鎖:
結果:import multiprocessing
import time
def add(number,value,lock):
with
lock:
print ("int add number =".format(value,number))
for i in xrange(5):
number +=value
time.sleep(1)
print ("add number =".format(value,number))
if __name__ == '__main__':
lock = multiprocessing.lock()
number = 0
p1 = multiprocessing.process(target=add,args=(number,1,lock))
p2 = multiprocessing.process(target=add,args=(number,3,lock))
p1.start()
p2.start()
print("main end")
main end
int add1 number =0
add1 number =1
add1 number =2
add1 number =3
add1 number =4
add1 number =5
int add3 number =0
add3 number =3
add3 number =6
add3 number =9
add3 number =12
add3 number =15
python的multiprocessing模組也給我們提供了共享記憶體的操作
一般的變數在程序之間是沒法進行通訊的,multiprocessing給我們提供了value和array模組,他們可以在不通的程序中共同使用
示例:
結果:import time
import multiprocessing
defadd
(number,add_value):
print ("int add number =".format(add_value,number.value))
for i in xrange(5):
number.value +=add_value
print ('##add has added!##'.format(add_value))
time.sleep(1)
print ("add number =".format(add_value,number.value))
defchange
(arr):
for i in range(len(arr)):
arr[i]=-arr[i]
if __name__ == '__main__':
number = multiprocessing.value('i',0)
p1 = multiprocessing.process(target=add,args=(number,1))
p2 = multiprocessing.process(target=add,args=(number,3))
arr = multiprocessing.array('i',range(5))
p3 = multiprocessing.process(target=change,args=(arr,))
p1.start()
p2.start()
p3.start()
print(arr[:])
print("main end")
[0, 1, 2, 3, 4]
main end
int add1 number =0
##add 1 has added!##
int add3 number =1
##add 3 has added!##
add1 number =4
##add 1 has added!##
add3 number =5
##add 3 has added!##
add1 number =8
##add 1 has added!##
add3 number =9
##add 3 has added!##
add1 number =12
##add 1 has added!##
add3 number =13
##add 3 has added!##
add1 number =16
##add 1 has added!##
add3 number =17
##add 3 has added!##
add1 number =20
add3 number =20
八 8 1多程序鎖和共享記憶體
多程序lock元件 當我們使用多程序讀寫檔案時,乙個程序寫檔案,乙個程序讀檔案。如果兩個程序同時進行,肯定不行,必須等寫結束後,才可以進行多操作。或者多個程序在共享一些資源時,同時只能有乙個程序進行訪問,需要乙個鎖機制控制。import multiprocessing import time loc...
多程序共享記憶體續篇 大鎖
讀寫鎖,就是多人可以同時訪問,但是同時只有乙個人可以修改的規則。由於鎖本身的申請和釋放,對於效能有很大的消耗,那麼一般寫只發生在特殊情況,也就是很少發生。讀鎖常在就是效能的優化方案,只有在申請寫鎖的時候,才會釋放讀鎖。和之前有什麼不一樣呢,例如,連續的在不同地方的100次讀,以前是要100次讀鎖的申...
多程序通訊(IPC) 共享記憶體
1 共享記憶體介紹 共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和...