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