1

これに似た wx/twisted アプリ (つまり、wx と twisted を別のスレッドで実行する) を実装することを計画しているため、このレシピで何が起こっているのかを理解しようとしています。ツイスト イベント ループと wx イベント ループの両方にスレッド セーフな方法でアクセスする必要があることを理解しています (つまり、reactor.callFromThread、wx.PostEvent など)。私が疑問に思っているのは、1 つのスレッド (このレシピの場合は GUI スレッド) でインスタンス化されたオブジェクトのインスタンス メソッドを、別のスレッドで実行されているリアクターの遅延 callBack および errBack メソッドとして渡すスレッド セーフです。それは良い考えですか?

twisted で利用できる wxreactor がありますが、グーグルで調べると、ライブラリに導入されて以来、これには多くの問題があることがわかります。最初に wxreactor 手法を思いついた人でさえ、wx とツイストを別々のスレッドで実行することを提唱しています。

この手法の他の例を見つけることができませんでしたが、いくつか見てみたいと思います。

4

2 に答える 2

0

スレッド間でインスタンス メソッドを渡すという唯一の行為は、それらのインスタンスの最終的な破棄を適切に同期する限り安全です (スレッドはメモリを共有するため、どちらが割り当て/初期化を行ったかは問題ではありません)。

全体的なスレッドの安全性は、これらのメソッドが実際に何を行うかに依存するため、「うまく機能する」ようにするだけで問題ありません。

于 2009-06-07T21:23:13.583 に答える
0

「いい案」とは言えません。wxreactor を使用して、reactor と GUI を同じスレッドで実行するだけです。

Schroeder 氏によって説明されたタイマー駆動のイベント ループ スタービング アプローチは、イベント ループ統合を実装するための最悪の可能性があるフェイル セーフな方法です。wxreactor(not )を使用する場合wxsupport、Twisted は多重化が内部的にスレッドに切り捨てられるアプローチを使用するようになり、タイマーを使用する必要がなくなりました。さらに良いのは、wxpython が公開さwxSocketれ、誰かがそれに基づいてリアクターを作成できるようにすることです。

ただし、別のスレッドを使用して Twisted と通信することに設定している場合は、 に渡す値として任意のスレッドから生成されたオブジェクトを使用できますが、 にのみ呼び出すDeferred.callback必要があることに注意してください。リアクター スレッド自体。Deferred はスレッドセーフではありません。いくつかのデバッグ ユーティリティのおかげで、クラスでさえスレッド セーフではないため、それらを使用するときは、Twisted のメイン スレッドを決して離れないように十分に注意する必要があります。つまり、UI スレッドに結果がある場合は、 を使用します。 Deferred.callbackDeferred reactor.callFromThread(myDeferred.callback, myresult)

于 2009-06-17T03:20:12.470 に答える