1

この質問は、私の質問Desktop GUI Loading Slowの続きです。

データベースからの多くのレコードフェッチクエリに sqlAlchemy を使用する wxPython で開発されたデスクトップ GUI があります。取得したレコードを Python 辞書に入れ、それを使用して GUI に入力しています。しかし、バックグラウンドで何千ものデータを読み取っているため、GUI が動かなくなり、読み込みが非常に遅くなります。問題は次のとおりです。

  1. sqlalchemy データ フェッチ クエリごとに個別のスレッドを作成する必要がありますか? これに対する答えが「はい」の場合、wx.callAfter() は (クエリごとに) 私が注目しなければならないメソッドですか? 誰かがサンプル/テストされていないコードまたはリンクを提供すると、役に立ちます。
  2. デスクトップ GUI で遅延読み込みを実装する他の方法はありますか?

PS: マルチスレッドと wxPython を行うのはこれが初めてであることに注意してください。私は以前、Python/Django の Web 開発者でした。また、制限によりコードを共有することはできません。

4

3 に答える 3

2

データの読み込み部分とデータの表示部分が分離されるように、アプリを再設計する必要があります。アプリのDBモデルにデータを入力する必要がある別のスレッドにデータをロードし、そのモデルを使用してGUIにデータを入力します。そのため、アプリがロードされるとGUIは高速にロードされますが、データが存在しない場所では「ロード中...」またはそのようなものが表示されますまだロードされていません。

高速化するもう 1 つの方法は、必要になるまでクエリを実行しないことです。たとえば、クエリ DB を取得するときに、get メソッドを使用してクラスにクエリをラップしますが、すべてコンテキストに依存します。

また、GUI が主に表示用である場合は、小さなデータの最初のセットをロードし、他のデータを他のビューにプッシュして、ユーザーがいくつかのメニューまたはタブを使用する必要がある場合があります。これにより、必要になるまでロードを遅らせるか、ロードすることができます。バックグラウンドで。

于 2012-04-19T17:02:12.427 に答える
0

データをロードするために使用するウィジェットについては言及していませんが、wx.grid.Grid または ListCtrl を使用する場合、はい、それぞれのウィジェットの仮想実装にいくつかの「遅延」読み込みがあります。たとえば、100 万個のセルを保持できるグリッドについては、wxPython デモを参照してください。Anuragの回答も参照してください。一度にすべてのデータをロードする必要はありません。実際に表示できるデータをロードするだけです。次に、ユーザーがスクロールしたときにさらに読み込むことができます (またはバックグラウンド スレッドで事前に読み込みます)。

于 2012-04-19T20:55:58.540 に答える
0

GUI がハングしないようにする方法はいくつかあります。もちろん、マルチスレッドを実行して、レコードをグローバル ディクショナリに詰め込むこともできます。しかし、グローバル インタープリター ロック(GIL) に遭遇する可能性があり、これはおそらく GUI の応答性に役立たないでしょう。

最初のオプションは、GUI ツールキットのイベント駆動型の性質を使用し、ツールキットによって提供される「タイムアウト」または「タイマー」機能を使用して、呼び出されるたびにいくつかのレコードをロードする関数を呼び出すことです。ジェネレーター関数はそのためにうまく機能します。これはおそらく実装が最も簡単です。一度にロードできるレコードの数は、マシンの速度によって異なります。単一のレコードから始めて、レコードの読み込みを測定し、レコードの量を増やして、各呼び出しにかかる時間が 0.1 秒より長くならないようにすることをお勧めします。

2 つ目は、2 つ目のプロセスを使用してデータをロードし、それを小さなチャンクで GUI に送信することです。別のプロセスを使用する (multiprocessingモジュールを使用する) ことには、Python の GIL を実行できないという利点があります。GUIのイベントループで2番目のプロセスからのメッセージを処理する必要があるため、これは多かれ少なかれ最初の方法を含む方法であることに注意してください。

于 2012-04-19T20:21:16.460 に答える