1. 程式人生 > >多程序鎖、共享記憶體

多程序鎖、共享記憶體

  1. 多程序鎖
    當我們用多程序來讀寫檔案的時候,如果一個程序是寫檔案,一個程序是讀檔案,如果兩個檔案同時進行,肯定是不行的,必須是檔案寫結束以後,才可以進行讀操作。或者是多個程序在共享一些資源的時候,同時只能有一個程序進行訪問,那就要有一個鎖機制進行控制。
    acquire()
    locked()
    release() //釋放鎖,使用前執行緒必須已獲得鎖定,否則丟擲異常
    lock=thread.allocate_lock():生成鎖物件
    lock.acquire():加鎖
    執行緒使用鎖物件
    lock.release(): 執行緒排程釋放鎖
    檢視locked()狀態
    獲得一把鎖,把對放的鎖釋放
    threading 高級別多執行緒模組
    threading 不需要程序的控制來控制執行緒
    threading.Thread: 類
    成員方法:
    start() 啟動
    run() 重寫
    join() 阻塞
    getName()
    setName()
    isDaemon() 判斷執行緒是否隨主執行緒一起結束
    setDaemon() 設定執行緒與主執行緒一起結束
  2. 多程序共享記憶體
    python的multiprocessing模組也給我們提供了共享記憶體的操作。
    一般的變數在程序之間是沒法進行通訊的,multiprocessing給我們提供了Value和Array模組,他們可以在不通的程序中共同使用。
    import multiprocessing
    
    #lock = multiprocessing.Lock()
    #lock.acquire()  獲取鎖
    #lock.release()  釋放鎖
    #with lock: 加鎖
    
    import time
    
    # Value()
    # Array()
    def add(number,add_value,lock):
        lock.acquire()
        try:
            print("init add{0} number = {1}".format(add_value,number.value))
            for i in xrange(1,6):
                number.value += add_value
                print("############add{0} has added#######".format(add_value))
                time.sleep(1)
                print("add{0} number = {1}".format(add_value,number.value))
        except Exception as e:
            raise e
        finally:
            lock.release()
    def change(arr):
        for i in range(len(arr)):
            arr[i] = -arr[i]
    
    if __name__ == "__main__":
        lock = multiprocessing.Lock() #加鎖
        number = multiprocessing.Value('i',0) #共享記憶體
        arr = multiprocessing.Array('i',range(10)) #共享記憶體陣列 
        print(arr[:])
        p1 = multiprocessing.Process(target=add,args=(number,1,lock))
        p2 = multiprocessing.Process(target=add, args=(number, 3,lock))
        p3 = multiprocessing.Process(target=change, args=(arr,))
        p1.start()
        #p1.join()
        p2.start()
        ##p2.join()
        p3.start()  #啟動
        p3.join()
        print(arr[:])
        print("main end")