1. 程式人生 > >day37——多進程鎖、多進程共享內存

day37——多進程鎖、多進程共享內存

對象 設置 高級 join() time pos name 狀態 讀文件

Lock組件

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

acquire()
locked()
release() //釋放鎖,使用前線程必須已獲得鎖定,否則拋出異常
lock=thread.allocate_lock():生成鎖對象
lock.acquire():加鎖
線程使用鎖對象
lock.release(): 線程調度釋放鎖
查看locked()狀態

獲得一把鎖,把對放的鎖釋放

threading 高級別多線程模塊

threading 不需要進程的控制來控制線程
threading.Thread: 類
成員方法:
start() 啟動
run() 重寫
join() 阻塞
getName()
setName()
isDaemon() 判斷線程是否隨主線程一起結束
setDaemon() 設置線程與主線程一起結束

共享內存
python的multiprocessing模塊也給我們提供了共享內存的操作

一般的變量在進程之間是沒法進行通訊的,multiprocessing給我們提供了Value和Array模塊,他們可以在不通的進程中共同使用

例子:

 1 import multiprocessing
 2 
 3 #lock = multiprocessing.Lock()
4 #lock.acquire() 獲取鎖 5 #lock.release() 釋放鎖 6 #with lock: 加鎖 7 8 import time 9 10 # Value() 11 # Array() 12 def add(number,add_value,lock): 13 lock.acquire() 14 try: 15 print("init add{0} number = {1}".format(add_value,number.value)) 16 for i in xrange(1,6): 17 number.value += add_value
18 print("############add{0} has added#######".format(add_value)) 19 time.sleep(1) 20 print("add{0} number = {1}".format(add_value,number.value)) 21 except Exception as e: 22 raise e 23 finally: 24 lock.release() 25 def change(arr): 26 for i in range(len(arr)): 27 arr[i] = -arr[i] 28 29 if __name__ == "__main__": 30 lock = multiprocessing.Lock() #加鎖 31 number = multiprocessing.Value(i,0) #共享內存 32 arr = multiprocessing.Array(i,range(10)) #共享內存數組 33 print(arr[:]) 34 p1 = multiprocessing.Process(target=add,args=(number,1,lock)) 35 p2 = multiprocessing.Process(target=add, args=(number, 3,lock)) 36 p3 = multiprocessing.Process(target=change, args=(arr,)) 37 p1.start() 38 #p1.join() 39 p2.start() 40 ##p2.join() 41 p3.start() #啟動 42 p3.join() 43 print(arr[:]) 44 print("main end") 45 46 輸出結果: 47 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 48 init add1 number = 0 49 ############add1 has added####### 50 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] 51 main end 52 add1 number = 1 53 ############add1 has added####### 54 add1 number = 2 55 ############add1 has added####### 56 add1 number = 3 57 ############add1 has added####### 58 add1 number = 4 59 ############add1 has added####### 60 add1 number = 5 61 init add3 number = 5 62 ############add3 has added####### 63 add3 number = 8 64 ############add3 has added####### 65 add3 number = 11 66 ############add3 has added####### 67 add3 number = 14 68 ############add3 has added####### 69 add3 number = 17 70 ############add3 has added####### 71 add3 number = 20

day37——多進程鎖、多進程共享內存