[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
質問
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 を使用します。
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] ネストしたdictからのPythonデータクラス
-
[解決済み] Pythonのモジュール命名規則
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Celeryでタスクのステータスを確認するには?
-
[解決済み] タプルの代わりにリストで出力するZip
-
[解決済み] IPythonの終了確認を無効にする
-
[解決済み] and "と "or "はブール値以外ではどのように作用するか?
-
[解決済み] virtualenvのどこにカスタムコードを置くか?
-
[解決済み] TypeError: can't multiply sequence by non-int of type 'float'」と表示されるのはなぜですか?
-
[解決済み] Pythonで文字列が数字で始まるかどうかを判断するには?
-
[解決済み] ネストした辞書の項目からpandasのDataFrameを構築する
-
[解決済み] pandasのデータフレームでカスタムソートする
-
[解決済み] 2ウェイ/リバースマップ[重複]について