質問: スレッドというものを利用する機会がないままここまでやってきました。 今まで私は、まず間違いなく、シングルスレッドで処理を実行してきました。自分の作っているアプリでは、データのロードをつかさどるメソッドがあり、データの量によってはこれが大きな時間を取る事があります。 その際、ユーザーの入力処理を受け付けなくなる時間があり、その間がとても気になり始めました。 そして、以前から気になっていたマルチスレッド処理を利用することを検討しようと思いました。 これは、複数のスレッドで並列処理を行う事が出来るようなのですが、こうした問題を解決する時に、並列処理を導入するということは、選択肢としては、いい方向性というか、間違ってはいないのでしょうか? 実際に導入したことが無いので、どれほどのものなのかという具体的なイメージが全く湧きません。 グラフィカルユーザーインターフェースで、大量のデータをロードする時に、マルチスレッドを利用することは、ベストプラクティスですか? ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エキスパート Python プログラミングという本を読んでいるのですが、私には少し内容が高度です。ただ、ユーザーインターフェースの応答性を向上させる時には、マルチスレッドを積極的に応用するべきですと書かれています。 開発環境 `python3.6.3 pyside1.2.4`です。
回答: Rapid GUI Programming with Python with PyQt 第19章 Multithreadingより シングルスレッドで長い実行処理が発生し、フリーズするようなら、いくつかの選択肢があります。 **1.** 特に長い実行処理ループ内では、`QApplication.processEvents()`が有効です。 **2.** `zero-timeout timers`を使う事。 **3.** 1と2を組み合わせて使う事。 例えば、**大量のファイルをロードする時は**大抵、3の方法で幾つかのエグザンプル内で使用しています。エグザンプルファイルを見てください。 **4.** Pythonの標準ライブラリである`subprocess`モジュールを使うか、PyQtの`QProcess`クラスを使いなさい。 マルチスレッドは大抵書くのが難しい、保守しづらい、デバッグしづらい。 シングルプロセスのマシンでは、遅くなることがある。 パイソンの標準ライブラリには、低レベルの`thread`モジュールと、高レベルの`threading`モジュールがある。しかしPyQtプログラミングのためには、PyQtのスレッドクラスを使うのがおすすめです。pythonより洗練されています。 結論を言えば、スレッドは最終手段にするべきで、データのロードについてなら、サブプロセス化をした方がいいようです。 プログラミングの知識や技術を挙げるのにスレッド化を一度経験しておくのも悪くないですし、process系のモジュールに触れた事が無いので、どちらもトライしてみるんもいいでしょう。19章を通して読んでエグザンプルを実行してみましょう。