2010-11-04 89 views
1

我正在使用PyGTK開發一個小應用程序。通過代理使用URLlib2會凍結我的GUI。無論如何要阻止這一點?urllib2凍結GUI

我的代碼實際上做的工作是從GUI分離,所以我想可能是使用子進程來調用python文件。但是,如果我將應用程序轉換爲exe文件,該如何工作?

由於

回答

6

從主線程塊調用的urllib2 GTK的事件循環,因而凍結用戶界面。這不是特定於urllib2,而是與任何更長時間運行的函數(例如subprocess.call)發生。

要麼使用glib中的異步IO設施,要麼在獨立的線程中調用urllib2來避免此問題。

+0

有沒有關於此的任何教程?我在Google上找不到任何好的示例。 – Pwnna 2010-11-04 21:02:28

+0

我不知道這個任何教程。你必須閱讀文檔併爲自己思考。 – lunaryorn 2010-11-05 15:16:30

+0

是的,我會盡力做到這一點。 – Pwnna 2010-11-06 16:33:23

0

我會考慮使用multiprocess模塊,創建一對Queue對象...一個用於GUI控制器或其他組件發送請求到urllib2進程;另一個用於返回結果。

只需一對Queue對象就足夠簡單的設計(只有兩個過程)。流程簡單處理來自請求隊列的請求,並向結果隊列發佈響應。另一方面的進程可以異步操作,發佈請求,並從事件循環中的任何地方(或從一個單獨的線程)提取響應並將它們發回字典或調度回調函數(可能還被維護爲字典)。 (例如,我可能有請求模型創建一個回調處理對象,使用對象的ID作爲關鍵字將其存儲在字典中,並將該ID和URL的元組發送到請求隊列,然後響應處理請求響應隊列的ID和響應文本,以便事件處理循環可以將響應調度到存儲在字典中的對象的.callback()方法開始。響應可以是URL文本結果,但可以處理Exception對象也可以實現(也許在我們假設的回調對象的接口中分派到.errback()方法)。當然,如果我們的主GUI是多線程的,我們必須確保對這個字典的連貫訪問,但是應該有相對較低的爭用。所有訪問這個詞典y是非阻塞的)。

更復雜的設計是可能的。一個urllib2處理進程池可以共享一對Queue對象(這些隊列的優點是它們處理我們所有的鎖定和一致性細節;支持多個生產者/消費者)。

如果需要將GUI分成多個進程,這些進程可以共享相同的進程或池,那麼就需要查找消息總線(例如傳播或AMQP)。共享內存和鎖定原語也可以使用;但那會涉及更多的努力。