1. 程式人生 > >python 64式: 第14式、多程序,佇列與鎖

python 64式: 第14式、多程序,佇列與鎖

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import multiprocessing
import time

'''
關鍵:
1 multiprocessing.Process(group=None, target=None, args=(), kwargs={})
target:可呼叫的函式名,將會被run()呼叫
args: target被呼叫方法的元組引數
kwargs:字典引數列表
multiprocessing.start()
開啟程序活動,需要被呼叫,開啟子程序
multiprocessing.join([timeout])
阻塞當前程序,直到子程序執行完畢或超時
terminate(): 終止程序
multiprocessing.cpu_count():返回系統中CPU的個數

2 鎖
多個程序訪問共享資源,Lock可以避免訪問衝突
multiprocessing.Lock():初始化
Lock.acquire():獲取鎖
Lock.release():釋放鎖
with lock: 獲取鎖和釋放鎖一起

3 多程序之間通訊可用佇列
multiprocessing.Queue.get([block[, timeout]])
block: True:表示阻塞,直到獲取到一個元素


ref:
https://docs.python.org/2/library/queue.html#Queue
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868323401155ceb3db1e2044f80b974b469eb06cb43000
https://blog.csdn.net/dutsoft/article/details/54694798
https://docs.python.org/2/library/multiprocessing.html
'''

def readQueue(myQueue):
    while True:
        value = myQueue.get(True)
        if value:
            print 'get value: {value}'.format(value=value)

def writeQueue(myQueue, datas=None):
    for data in datas:
        myQueue.put(data)
        print "set value: {value}".format(value=data)


def processQueue():
    myQueue = multiprocessing.Queue()
    reader = multiprocessing.Process(target=readQueue, args=(myQueue,))
    writer = multiprocessing.Process(target=writeQueue, args=(myQueue,), kwargs={'datas': range(1,3)})
    reader.start()
    writer.start()
    writer.join()
    # NOTE: it needs to put reader.join() after writer.join(), otherwise there is blocking
    reader.join()

def taskWrite(lock, f):
    with lock:
        with open(f, "w+") as f:
            f.write("hello ")
            time.sleep(1)

def taskWriteAppend(lock, f):
    lock.acquire()
    try:
        with open(f, "a+") as f:
            time.sleep(1)
            f.write("world!")
    except Exception as ex:
        print ex
    finally:
        lock.release()

def processLock():
    lock = multiprocessing.Lock()
    fileName = "./file.txt"
    p1 = multiprocessing.Process(target=taskWrite, args=(lock, fileName,))
    p2 = multiprocessing.Process(target=taskWriteAppend, args=(lock, fileName,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    with open(fileName, 'r') as f:
        for x in f.readlines():
            print x

def process():
    processLock()
    processQueue()

if __name__ == "__main__":
    process()