1. 程式人生 > >使用Python的Queue實現執行緒/程序間通訊

使用Python的Queue實現執行緒/程序間通訊

連結

    最近在做一個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)