クライアントがこれを行う場合:
clientDeferred = server.callRemote("ftp_listen", arguments)
そして、サーバーはこれを行います:
def remote_ftp_listen(self, arguments):
# ... some stuff with FTP ...
serverDeferred = ftpConnection.findSomeFile(arguments)
return serverDeferred
wherefindSomeFile
が のインスタンスを返す場合Deferred
、PB サーバーは の起動後にクライアントに応答を返し、クライアントserverDeferred
がclientDeferred
サーバーからの応答を受信した後に起動します。
一度にすべての結果が返されてよければ、この方法で複数の結果を返すこともできます (最後の結果が見つかったときに発生します)。サーバーを調整するだけです:
from twisted.internet.defer import gatherResults
def remote_ftp_listen(self, arguments):
# ... some stuff with FTP ...
serverDeferred = gatherResults([ftpConnection.findSomeFile(a) for a in arguments])
return serverDeferred
Deferred
によって返されたは、渡されたリスト内gatherResults
のすべてのオブジェクトの結果を保持するリストで起動します。Deferred
すべての結果を 1 つの結果リストにまとめるのではなく、結果が検出されたらすぐにクライアントに送信する必要がある場合は、別のことを行う必要があります。クライアントReferenceable
にサーバーに を渡させ、サーバーにそのオブジェクトのリモート メソッドを呼び出させます。このアプローチの詳細については、Twisted Web サイトの PB ドキュメントを参照してください。 特にhttp://twistedmatrix.com/documents/current/core/howto/pb-usage.htmlはこのトピックに入ります。Referenceable
このドキュメントでは、サーバーからクライアントへのオブジェクトの受け渡しに焦点を当てていますが、その逆もまったく同じように機能します。したがって、サーバー上Referenceable
のリモート メソッドに渡すクライアント上に がある場合ftp_listen
、サーバーは向きを変えcallRemote
て、クライアント オブジェクト上のメソッドを呼び出すために使用できます。