多進程(2)

  1 #
  2 
  3 #Lock組件
  4 
  5 #當咱們用多進程來讀寫文件的時候,若是一個進程是寫文件,一個進程是#讀文件,若是兩個文件同時進行,確定是不行的,必須是文件寫結束後,#才能夠進行讀操做。或者是多個進程在共享一些資源的時候,同時只能有#一個進程進行訪問,那就要有一個鎖機制進行控制。
  6 
  7  
  8 
  9 #acquire()
 10 #locked()
 11 #release()
 12 #釋放鎖,使用前線程必須已得到鎖定,不然拋出異常
 13 #lock=thread.allocate_lock():
 14 #生成鎖對象
 15 #lock.acquire():
 16 #加鎖
 17 #線程使用鎖對象
 18 #lock.release(): 
 19 #線程調度釋放鎖
 20 #查看locked()狀態
 21 
 22 #得到一把鎖,把對放的鎖釋放
 23 
 24 #threading 高級別多線程模塊
 25 
 26 #threading 不須要進程的控制來控制線程
 27 #threading.Thread: 類
 28 #成員方法:
 29 #start() 啓動
 30 #run() 重寫
 31 #join() 阻塞
 32 #getName()
 33 #setName()
 34 #isDaemon() 判斷線程是否隨主線程一塊兒結束
 35 #setDaemon() 設置線程與主線程一塊兒結束
 36 import multiprocessing
 37 
 38 #lock = multiprocessing.Lock()
 39 #lock.acquire()  獲取鎖
 40 #lock.release()  釋放鎖
 41 #with lock: 加鎖
 42 
 43 import time
 44 
 45 # Value()
 46 # Array()
 47 def add(number,add_value,lock):
 48     lock.acquire()
 49     try:
 50         print("init add{0} number = {1}".format(add_value,number.value))
 51         for i in xrange(1,6):
 52             number.value += add_value
 53             print("############add{0} has added#######".format(add_value))
 54             time.sleep(1)
 55             print("add{0} number = {1}".format(add_value,number.value))
 56     except Exception as e:
 57         raise e
 58     finally:
 59         lock.release()
 60 def change(arr):
 61     for i in range(len(arr)):
 62         arr[i] = -arr[i]
 63 
 64 if __name__ == "__main__":
 65     lock = multiprocessing.Lock() #加鎖
 66     number = multiprocessing.Value('i',0) #共享內存
 67     arr = multiprocessing.Array('i',range(10)) #共享內存數組 
 68     print(arr[:])
 69     p1 = multiprocessing.Process(target=add,args=(number,1,lock))
 70     p2 = multiprocessing.Process(target=add, args=(number, 3,lock))
 71     p3 = multiprocessing.Process(target=change, args=(arr,))
 72     p1.start()
 73     #p1.join()
 74     p2.start()
 75     ##p2.join()
 76     p3.start()  #啓動
 77     p3.join()
 78     print(arr[:])
 79     print("main end")
 80 
 81 輸出結果:
 82 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 83 init add1 number = 0
 84 ############add1 has added#######
 85 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
 86 main end
 87 add1 number = 1
 88 ############add1 has added#######
 89 add1 number = 2
 90 ############add1 has added#######
 91 add1 number = 3
 92 ############add1 has added#######
 93 add1 number = 4
 94 ############add1 has added#######
 95 add1 number = 5
 96 init add3 number = 5
 97 ############add3 has added#######
 98 add3 number = 8
 99 ############add3 has added#######
100 add3 number = 11
101 ############add3 has added#######
102 add3 number = 14
103 ############add3 has added#######
104 add3 number = 17
105 ############add3 has added#######
106 add3 number = 20
107  
108 
109 #共享內存
110 #python的multiprocessing模塊也給咱們提供了共享內存的操做
111 #通常的變量在進程之間是無法進行通信的,multiprocessing給咱們提供了Value和Array模塊,他們能夠在不通的進程中共同使用
相關文章
相關標籤/搜索