0

マルチスレッド PyQt4 アプリを使用したことがある人はいますか? PyQt4フレームワークのQtThreadと組み合わされた組み込みのシグナル/スロットメカニズムが、イベント駆動型の非同期コールバックを使用して、標準のPythonスレッド(私のコードでUIコンポーネントをスレッドセーフな方法で処理するように設計されている)よりも利点があるかどうか疑問に思っていました。

速度やセキュリティに関する重大な問題、特定の実行時の例外、またはエッジ ケースを探しています。(UI は非常に複雑であるため、後の段階で書き直すと非常に非生産的になります)。

ありがとう。

編集:これは、既存の PyQt コア機能の一部を複製することを意味する可能性があることを理解していますが、アプリ内でより柔軟にできるのであれば問題ありません。

4

2 に答える 2

0

シグナル アンド スロット メカニズムを使用せず、独自のイベント ループを展開していない場合、Qt/PyQt を実際に使用しても意味がありません。基本的に、フレームワーク自体のコアを再実装することになります。しかし、これはあなたが求めているものではないと思います。

質問を少し明確にしていただければ幸いです(そのため、いくつかの仮定を立てる必要がありました)が、ここに取り引きがあります:

シグナルとスロットの仕組みについて少し混乱していると思います。(または、そうではないかもしれませんが、おそらくあなたにとって明白かもしれないいくつかのことを繰り返して申し訳ありません)。

シグナルとスロットはスレッド化を実装していません (したがって、標準の Python スレッドよりも利点のあるシグナル/スロットを使用するという問題は意味がありません)。

おそらく、シグナルスロットメカニズムはマルチスレッド化されており、シグナルによって呼び出されたスロットは新しいスレッドで実行されると想定しているでしょう。まあ、そうではありません。

Qt のシグナルとスロット メカニズムは、Qt の単一のイベント ループ (QApplication によって実装) で実行され、それ自体が単一のスレッドで実行されます。したがって、シグナルとスロットはマルチスレッドの代わりにはなりません。

ブロックするスロットがある場合、アプリケーション全体がブロックされます。したがって、ブロッキング I/O または時間のかかる関数は、理想的には UI とは別のスレッドに配置する必要があり、スロットはこれらのスレッドの実行を開始する必要があります。独自のスレッドを実装するために QThread を使用するか、標準の Python スレッドを使用するかは別の問題であり、以前 StackOverflow で尋ねられましたが、Qt アプリには QThreads を使用する傾向があります。

したがって、ボタンがあり、クリックされたときに Requests ライブラリでファイルのダウンロードを開始したい場合clickedは、QPushButton の信号をたとえばスロットに接続するdownloadButtonClickedと、そのスロットは新しい QThread を開始します。リクエストを使用してファイルをダウンロードすること。QThread からの finished() シグナルをさらに接続して、ダウンロードがいつ完了したかを知り、UI を更新することができます

(これが実際にあなたが求めているものである場合は、コード例を追加します。質問を明確にしてください)

于 2013-10-21T12:45:47.937 に答える
0

別の返信に対するあなたのコメントに基づいて:

あいまいで申し訳ありませんが、組み込みの Python スレッドを使用した QtThread スロット/シグナル メカニズムとコールバックについて話していました。イベントの到着 (クリックなど) で UI とは別のスレッドを作成し、新しいスレッドからメイン UI スレッドへのコールバックを使用して UI を更新する予定です (メイン スレッド内のすべての UI ロジックは、スレッド セーフに保つためにロックを使用します)。これは、既存の PyQt 機能の一部を複製することを意味する可能性があることはわかっていますが、このようにすると、アプリをより細かく制御できるようになると感じています。(余分な作業は、アプリの柔軟性を高めることができれば問題ありません。さらに、それほど多くの作業はありません)

あなたが求めているQApplication.postEvent()のは、スレッドから使​​用することだと思います。コードを少し追加すると、これを使用してメイン スレッドで任意のメソッドを同期的または非同期的に実行できます。

どちらのオプション (Qt または Python スレッド) にも実際に利点または欠点があるかどうかはわかりません。私の知る限り、どちらもまだ GIL を保持しています。つまり、あなたのプログラムは決して真のマルチスレッドではありません。QThreadsにはイベントループが付属していますが、あなたが言うように、独自のPythonスレッドで自分自身を書くのは難しくありません.

複数のスレッドの代わりに複数のプロセスを使用することを検討しましたか? 開始するのは遅くなりますが、実際にコードを並行して実行できるという利点があります。

結局のところ、あなたの質問への答えは単に個人的な好みだと思います。PyQt\PySide\Qt が死んでしまった場合に、アプリケーションを別のウィジェット ツールキットに簡単に移植できるようにするため、a の使用を避けることをQThreadお勧めします (その可能性が非常に高いというわけではありませんが、私は PyGTK で悪い経験をしたことがあるので、今は警戒しています)

編集:私が与えたよりもはるかに優れた回答があるので、これも見てください: PyQt アプリケーションでのスレッド化: Qt スレッドまたは Python スレッドを使用しますか?

于 2013-10-21T22:46:16.307 に答える