使用Python的Queue實現執行緒/程序間通訊
阿新 • • 發佈:2019-01-30
最近在做一個P2P的東西,使用Python和PyQt4開發,核心功能用xml-rpc實現。核心功能完成了一部分了,如加入P2P網路、查詢節點等。 用PyQt做介面,但是不知道如何將後端和GUI結合起來。後端是一個xml-rpc的服務端主迴圈,起了幾個執行緒用來維護節點列表,和查詢同網段節點。我希望後端能呼叫GUI的方法更新介面資料。也需要GUI能提交命令給後端。我想過幾種辦法:
多執行緒,把前後端寫到一塊,從PyQt起一個執行緒執行後端程式碼,這樣好象比較亂,這是不是需要“執行緒間通訊”?
分開成兩個程序,我發現很多軟體,迅雷、風行什麼的都是兩個程序,應該是一個後端負責通訊和處理資料,一個負責和使用者互動吧。但是程序之間如何通訊,我覺得xml-rpc是最簡單的。直接把通訊用的方法放到原來的類裡面嗎,還是再弄個xml-rpc服務?
程式現在是在Debian下開發,最終要打包成exe,在windows下執行的,多程序會不會麻煩?
帶著這些問題,我查閱了很多資料,也在郵件列表裡向人請教。最終決定使用Queue來做。經過探索,學到了很多Queue的用法,在此通過一個簡單的例子說明一下:
01 import time 02 from Queue import Queue 03 from threading import Thread 04 05 def do_somthing(q): 06 while 1: 07 if not q.full(): 08 q.put('New task') 09 print 'Put a new task at', time.strftime('%H:%M:%S', time.localtime()) 10 q.join() #阻塞,直到任務完成 11 q = Queue() 12 t = Thread(target=do_somthing, args=(q,)) 13 t.setDaemon(1) 14 t.start() 15 16 while 1: 17 if not q.empty(): 18 print 'Got', q.get(),'at', time.strftime('%H:%M:%S', time.localtime()) 19 time.sleep(2) 20 q.task_done() #告訴佇列任務完成以解除阻塞 21 time.sleep(1)