0

私の wx GUI にはサムネイルが表示されますが、生成が遅いため、次のようになります。

  • サムネイルが生成されている間、プログラムは引き続き使用できるはずです。
  • 新しいフォルダーに切り替えると、古いフォルダーのサムネイルの生成が停止するはずです。
  • 可能であれば、サムネイルの生成には複数のプロセッサを使用する必要があります。

これを行う最善の方法は何ですか?

4

1 に答える 1

4

サムネイルの生成をバックグラウンド スレッドに配置するthreading.Threadと、最初の問題が解決され、プログラムが使用可能になります。

中断する方法が必要な場合、通常の方法は、バックグラウンド スレッドが頻繁に (たとえば、サムネイルごとに 1 回) チェックする "stop" 変数を追加し、いつ停止するかを GUI スレッドが設定することです。理想的には、これを で保護する必要がありthreading.Conditionます。(ほとんどの場合、この条件は実際には必要ありません。コードの並列化を妨げているのと同じ GIL が、特定の種類の競合状態からも保護します。しかし、それに依存するべきではありません。)

3 番目の問題の場合、最初の質問は次のとおりです。サムネイルの生成は実際に CPU バウンドですか? ディスクからのイメージの読み取りと書き込みにより多くの時間を費やしている場合は、おそらくそうではないため、並列化しようとしても意味がありません。しかし、そうだとしましょう。

まず、N 個のコアがある場合は、N 個のスレッドのプールが必要です。メイン スレッドにも多くの作業が必要な場合は N-1 個が必要です。または、2N または 2N-1 のようなもので、少し良いものをトレードオフする必要があります。少し最悪の場合のパフォーマンスの場合のパフォーマンス。

ただし、その CPU 作業が Python で行われるか、それでも Python GIL を保持している C 拡張で行われる場合、ほとんどの場合、これらのスレッドの 1 つだけが実際に実行されるため、これは役に立ちません。

multiprocessingこれに対する 1 つの解決策は、理想的には標準モジュールを使用して、スレッドからプロセスに切り替えることです。プロセスのプールを作成し、単純な負荷分散を使用してプールにジョブを送信するための API が組み込まれています。

プロセスを使用する際の問題は、データの自動共有ができなくなるため、「停止フラグ」が機能しないことです。共有メモリにフラグを明示的に作成するか、代わりにパイプまたはその他の通信メカニズムを使用する必要があります。ドキュメントは、これmultiprocessingを行うためのさまざまな方法を説明しています。

実際には、サブプロセスを強制終了することができます。ただし、これを実行したくない場合があります。まず、コードを慎重に記述しないと、サムネイル キャッシュが一貫性のない状態のままになり、コードの残りの部分が混乱する可能性があります。また、これを Windows で効率的にしたい場合は、サブプロセスの作成に時間がかかります (「30 分」などではありませんが、ユーザーが新しいフォルダー) であるため、必要になる前にプールを作成し、プログラムの存続期間全体にわたって保持することをお勧めします。

それ以外は、ジョブのサイズを正しく設定する必要があります。うまくいけば、1 つのサムネイルを作成するのはそれほど大きな仕事ではありませんが、それが小さすぎる場合は、複数のサムネイルを 1 つのジョブにまとめることができます。または、より簡単に、multiprocessingAPI を見て、ジョブをバッチ処理する方法を変更することができます。負荷分散。

一方、プール ソリューション (スレッドかプロセスかに関係なく) を使用する場合、ジョブが十分に小さい場合は、実際にキャンセルする必要はないかもしれません。ジョブ キューを空にするだけです。各ワーカーは、現在処理中のジョブを終了しますが、さらにジョブをフィードするまでスリープします。終了するときは、キューを空にすることも忘れないでください (そして、プールに参加することもできます)。

最後に覚えておくべきことは、コンピューターが生成できる速度でサムネイルを正常に生成すると、実際にはコンピューター全体、つまり GUI が遅くなり、応答しなくなる可能性があるということです。これは通常、コードが実際に I/O バウンドでディスク帯域幅のほとんどを使用している場合、または大量のメモリを使用してスワップ スラッシュをトリガーしている場合に発生しますが、コードが実際には CPU バウンドであり、すべての CPU を使用しているために問題が発生している場合は、使用するコアを 1 つ減らすか、スレッド/プロセスの優先順位の設定を検討することをお勧めします。

于 2012-12-12T00:33:54.330 に答える