1. ホーム
  2. python

[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?

2022-07-06 12:16:22

質問

GUIアプリケーションを書いているのですが、定期的にWeb接続でデータを取得します。この取得には時間がかかるため、取得処理中に UI が応答しなくなります (小さな部分に分割することができません)。このため、Web接続を別のワーカスレッドにアウトソースしたいと思います。

[そうそう、今私は 2つの問題 .]

とにかく、このアプリケーションはPyQt4を使っているので、何が良い選択なのか知りたいのです。Qtのスレッドを使うか、Pythonの threading モジュールを使うか?それぞれの利点/欠点は何ですか?または、全く別の提案がありますか?

編集(re bounty)。 私の特定のケースでの解決策は、おそらく以下のようなノンブロッキングネットワークリクエストを使用することでしょう。 ジェフ・オバー Lukáš Lalinský が提案したように (つまり、基本的に並行処理の問題はネットワーク実装に任せる)、私はまだ一般的な質問に対するより詳細な回答が欲しいです。

PyQt4(つまりQt)のスレッドをネイティブPythonのスレッドよりも使用することの利点と欠点は何ですか( threading モジュールから)使用する利点は何ですか?


2を編集します。 回答ありがとうございました。100%の同意はありませんが、答えは "use Qt" であるというコンセンサスが広がっているようです。なぜなら、その利点はライブラリの残りの部分との統合であり、実際のデメリットは生じないからです。

2つのスレッド実装のどちらかを選択しようとしている人には、ここで提供されたすべての回答、および以下のPyQtメーリングリストのスレッドを読むことを強くお勧めします。 abbot がリンクしている PyQt メーリングリストのスレッドも含めて、ここで提供されているすべての回答を読むことを強くお勧めします。

賞金目当てで考えた回答がいくつかありましたが、最終的には、非常に関連性の高い外部参照を持つabbotのものを選びました。

本当にありがとうございます。

どのように解決するのですか?

これは 議論された で議論されました。Giovanni Bajoの コメント を引用しています。

<ブロッククオート

ほとんど同じです。主な違いは、QThreads が Qt とよりよく統合されていることです。 非同期シグナル/スロット、イベントループ、など)です。 また、PythonのスレッドからQtを使うことはできません(例えば、QTスレッドからメインスレッドにイベントをポストすることはできません)。 QApplication.postEventでメインスレッドにイベントを投稿することはできません)。 そのためにはQThreadが必要です。

一般的な経験則は、もしあなたがQtと何らかの形で対話しようとしているならばQThreadsを使用し、そうでなければPythonスレッドを使用することでしょう。

PyQtの作者によるこのテーマに関する以前のコメント: "それらは両方とも同じネイティブスレッド実装のラッパーです"。そして、どちらの実装も同じように GIL を使用します。