2012-04-19 64 views
1

這個問題是我的問題Desktop GUI Loading Slow的延續。減少wxPython GUI加載時間的方法

我有一個在wxPython中開發的桌面GUI,它使用sqlAlchemy進行數據庫中的許多記錄提取查詢。我將提取的記錄放入Python字典中,並使用它填充GUI。但是,由於我在後臺讀取數以千計的數據,因此GUI卡住並加載非常緩慢。現在的問題是:

  1. 我應該爲每個sqlalchemy數據提取查詢創建單獨的線程嗎?如果答案是肯定的,那麼wx.callAfter()是我必須關注的方法(對於每個查詢)?如果有人提供樣本/未經測試的代碼或鏈接,那麼這將有所幫助。
  2. 是否有任何其他方式在桌面GUI中實現延遲加載?

請注意,這是我第一次使用多線程和wxPython。我曾是Python/Django的Web開發人員。另外,由於限制,我無法共享代碼。

+0

請參閱[this](http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/)關於wxPython中多線程的文章 – Ambyte 2012-04-20 08:58:30

回答

2

您應該重新設計您的應用程序,以便數據加載部分和數據顯示部分是分開的。將數據加載到應該在應用程序中填充數據庫模型的單獨線程中,使用該模型來填充GUI,因此,當應用程序加載GUI時,加載速度會很快,但會顯示「正在加載...」或其他類似數據的位置裝載尚未。

另一種加快速度的方法是在需要它們之前不要運行查詢。用get方法將它們包裝在一個類中,在獲取查詢數據庫的同時,所有這些都取決於上下文。

另外,如果GUI主要用於查看,那麼您可以加載第一組小數據並將其他數據推送到其他用戶必須通過某些菜單或選項卡的視圖,這樣您可以延遲加載,直到它需要或在後臺加載它們。

0

有幾種方法可以防止GUI掛起。當然,您可以執行多線程並將記錄填充到全局字典中。但是你可能會遇到global interpreter lock(GIL),這可能無助於GUI的響應。

第一個選項是使用GUI工具包的事件驅動特性,並使用工具包提供的「超時」或「計時器」功能調用每次調用時加載一對記錄的函數。 A generator function會很好地工作。這可能是最容易實現的。您可以一次加載多少條記錄取決於機器的速度。我建議先從單個記錄開始,測量記錄的加載量,然後增加記錄的數量,以便每次調用時間不超過0.1秒。

其次是使用第二個進程加載數據,然後以小塊將其發送到GUI。使用單獨的過程(使用multiprocessing模塊)具有無法運行到Python的GIL的優勢。請注意,這個方法或多或少包含第一種方法,因爲您仍然必須在GUI的事件循環中處理來自第二個進程的消息。

0

你沒有提到你使用哪些小部件來加載數據,但是如果你使用wx.grid.Grid或ListCtrl,那麼是的,在相應的虛擬實現中有一些「惰性」加載的東西小部件。例如,請參閱wxPython演示,瞭解可容納一百萬個單元格的網格。另見Anurag的回答。你真的不需要一次加載所有的數據。只需加載可以實際顯示的數據。然後,當用戶滾動(或將其預加載到後臺線程中)時,可以加載更多內容。