python 64式: 第14式、多程序,佇列與鎖
阿新 • • 發佈:2018-11-08
#!/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()