2

私はツイストを初めて使用し、非同期プログラミング全般、特にツイストの設計パターンを理解しようとしています。設計の観点から、次のように Protocol サブクラスからリアクターにアクセスすることをお勧めします。

class A(Protocol):
   def __init__(self):
      reactor.callLater(5, function_not_defined_here)
4

2 に答える 2

3

はい、それは完全に標準です。アプリケーションのどこからでもリアクター メソッドを呼び出すことができます ( preまたはpost reactor.run())。唯一の例外は、スレッドを使用する場合です。この場合、リアクター メソッドの呼び出しを でラップする必要があります。reactor.callFromThread()たとえば、次のようになります。

reactor.callFromThread(reactor.callLater, 5, function_not_defined_here)
于 2011-06-23T11:04:23.080 に答える
2

これに対していくつかの調整を検討できます。

  • reactorを引数として受け入れます。これにより、ユニットテストで偽のリアクターを渡すことができるため、コードをより簡単にテストできます。これは、リアルタイムとは無関係でありA、意図したとおりに動作することを確認するために検査できます。
  • の結果を破棄しないでくださいreactor.callLaterA必要に応じて後で使用できるように、インスタンスの属性として保存します。たとえば、キャンセルしたい場合があります (A遅延呼び出しが実行される前にインスタンスが接続を失った場合を考えてください)。
  • reactor.callLater電話をかけないでくださいA.__init__。代わりに、 で呼び出しますA.connectionMade。これは、遅延呼び出しを使用している理由によって少し異なりますが、プロトコルがインスタンス化された後ではなく、接続が確立された後に何かを実行する可能性が高くなります。これにより、reactor をいじっていないインスタンスを作成することもできますA(これは、単体テストでやりたいことの 1 つです)。
于 2011-06-23T12:58:34.227 に答える