python 64式: 第15式、多程序,訊號量與程序間通訊
阿新 • • 發佈:2018-11-27
#!/usr/bin/env python # -*- coding: utf-8 -*- import multiprocessing import time ''' 關鍵 1 訊號量 multiprocessing.Semaphore(n): n表示資源總數 作用: 控制對共享資源的訪問數量 適用: 池的最大連線數 本質: 相當於N把鎖,獲取其中一把就可以執行 訊號量總數N在構造時傳入 s = Semaphore(N) 如果訊號量為0:程序堵塞,直到訊號量大於0 適用:控制對共享資源的訪問數量,例如池的最大連線數,訪問伺服器,檔案 訊號量基於計數器,每呼叫一次acquire(),計數器可減去1; 每呼叫一次release(),計數器加1,當計數器為0,acquire()被阻塞。 2 事件 multiprocessing.Event: 作用:實現程序之間同步通訊 預設值為false: set(): 表示這是為True wait():等待 ref: https://www.cnblogs.com/lidagen/p/7252247.html https://www.cnblogs.com/kaituorensheng/p/4445418.html ''' def first(event): time.sleep(3) print "begin set flag" event.set() def second(event): print "wait first process" event.wait() print "end wait first process" def processEvent(): myEvent = multiprocessing.Event() firstProc = multiprocessing.Process(target=first, args=(myEvent,)) secondProc = multiprocessing.Process(target=second, args=(myEvent,)) secondProc.start() firstProc.start() firstProc.join() secondProc.join() def smaphoreTask(semaphore, msg): semaphore.acquire() # print "hello: %s" % (msg) print "{name} acquire".format(name=multiprocessing.current_process().name) time.sleep(msg) semaphore.release() print "{name} release".format(name=multiprocessing.current_process().name) def processSemaphore(): s = multiprocessing.Semaphore(multiprocessing.cpu_count()) processes = [] for x in range(8): p = multiprocessing.Process(target=smaphoreTask, args=(s,x,)) processes.append(p) start = time.time() for p in processes: p.start() for p in processes: p.join() end = time.time() print "8 process cost: %s seconds" % (end - start) def process(): processSemaphore() processEvent() if __name__ == "__main__": process()