1. 程式人生 > >python 64式: 第15式、多程序,訊號量與程序間通訊

python 64式: 第15式、多程序,訊號量與程序間通訊

#!/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()