2009-06-07 17 views
1

this recipeで何が起きているのか、私は頭を抱き締めようとしています。これはwx/twisted app別々のスレッドで実行されます)。私は、スレッドセーフな方法(すなわちreactor.callFromThread、wx.PostEventなど)でtwistedおよびwxイベントループの両方にアクセスする必要があることを理解しています。私が質問しているのは、別のスレッドで実行されているリアクターの遅延コールバックメソッドとerrBackメソッドとして、あるスレッド(このレシピの場合はGUIスレッド)でインスタンス化されたオブジェクトのインスタンスメソッドを渡すスレッドセーフです。それは良いアイデアですか?インスタンスメソッドがインスタンス化スレッドとは別のスレッドで呼び出されました

wxリアクターがねじれていますが、グーグルではライブラリに導入されて以来、数多くの問題があることが明らかになりました。最初はwxリアクターテクニックを手にした人でさえ、advocates running wx and twisted in separate threads

私はこの技術の他の例を見つけることができませんでしたが、私はいくつかを見たいと思います。

答えて

0

私は「良いアイデア」とは言いません。リアクターとGUIをwxreactorを使って同じスレッドで実行するだけです。

Schroeder氏が記述したタイマー駆動のイベントループ飢餓アプローチは、イベントループの統合を実装する最悪のフェールセーフな方法です。 wxreactorwxsupportではない)を使用している場合、Twistedはマルチプレックスが内部的にスレッドに分流されるようになり、タイマーを使用する必要はありません。 wxpythonがwxSocketを公開し、誰かに反応炉を敷設させる方が良いでしょう。

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

0

スレッド間でインスタンスメソッドを渡す唯一の方法は、それらのインスタンスの最終的な破壊を適切に同期させる限り安全です(スレッドはメモリを共有するので、どちらが割り当て/初期化されても問題ありません) 。

全体的なスレッドの安全性は、それらのメソッドが実際に何をするかによって異なります。したがって、それらを「うまくいく」ようにしてください。

関連する問題