多程序鎖和共享記憶體

2021-08-13 09:40:57 字數 3870 閱讀 3664

當我們用多程序來讀寫檔案的時候,如果乙個程序是寫檔案,乙個程序是讀檔案,如果兩個檔案同時進行,肯定是不行的,必須是檔案寫結束以後,才可以進行讀操作。或者是多個程序在共享一些資源的時候,同時只能有乙個程序進行訪問,那就要有乙個鎖機制進行控制。

需求:

乙個程序寫入乙個檔案,乙個程序追加檔案,乙個程序讀檔案,同時啟動起來

我們可以通過程序的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對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和...