進(jìn)程間通信與進(jìn)程池
進(jìn)程間通信-Queue
通常利用multiprocessing模塊的Queue實(shí)現(xiàn)多線程之間的數(shù)據(jù)傳遞,Queue本身是一個(gè)消息列隊(duì)程序
- q=Queue()#若括號(hào)中沒有指定最大可接受的消息數(shù)量或數(shù)量為負(fù)值,那么代表可接受的消息數(shù)量沒有上限直到內(nèi)存耗盡
- Queue.qsize():返回當(dāng)前隊(duì)列包含的消息數(shù)量
- Queue.empty():隊(duì)列為空返回True
- Queue.full():隊(duì)列為滿返回True
- Queue.get([block[,timeout]]):獲取隊(duì)列中的一條消息,然后將其從隊(duì)列中移除,block默認(rèn)值為True
- 若block使用默認(rèn)值,且沒有設(shè)置timeout(單位秒),消息隊(duì)列如果為空,此時(shí)程序?qū)⒈蛔枞ㄍT谧x取狀態(tài)),直到從消息隊(duì)列讀到消息為止,如果設(shè)置了timeout,則會(huì)等待timeout秒。若還沒有讀到任何消息,拋出Queue.Empty異常
- 若block值為False,消息隊(duì)列如果為空,則會(huì)理科拋出“Queue.Empty”異常
- Queue.get_nowait():相當(dāng)Queue.get(False);
- Queue.put(item,[block[, timeout]]):將item消息寫入隊(duì)列,block默認(rèn)值為True;
實(shí)例
from multiprocessing import Process,Queue
import os,time,random
def write(q):
for value in ['A','B','C']:
print('Put %s to queue ... '%value)
q.put(value)
time.sleep(random.random())
def read(q):
while True:
if not q.empty():
value = q.get(True)
print('Get %s from queue.' %value)
time.sleep(random.random())
else:
break
if __name__=='__main__':
q = Queue()
pw = Process(target=write,args=(q,))
pr = Process(target=read,args=(q,))
pw.start()
pw.join()
pr.join()
pr.join()
print('')
print('所有數(shù)據(jù)都寫入并且已經(jīng)讀完')