2

これは、ツイスト HTTP サーバーの resource.Resource から継承されたクラスの render_GET 関数です。

    def render_GET(self, request):
           file = request.args['file'][0]
           altitude, azimuth, distance = request.args['position'][0].split(",")
           self.update_render(file, altitude, azimuth, distance, request.args['clientID'][0])
           # update_render() starts a thread that contacts this server again and POSTs data once done
           self.add_client(request.args['clientID'][0])

           while not self.client_data[request.args['clientID'][0]]:
                 # I GET STUCK HERE - the thread CANT send data to this dict since server is locked in this loop
                 time.sleep(0.5)

           return "DONE"

何が起こるかというと、関数が何かを実行するまで待機するねじれたサーバーが必要update_renderです (この関数は非同期であるためself.update_render()、実際のデータがいつ書き込まれるかわからないので、呼び出して開始するだけです。戻りデータはupdate_render()self.client_data dict に書き込まれます。

ループでこの dict の内容を検出する必要がありますが、そこにスタックしています - サーバーがこのループでロックされているようですが、他のクライアントに応答する必要があります (非同期で self.client_data を埋めます)

4

1 に答える 1

1

Twisted を使用するアプリケーションでそのような while ループを書きたくないでしょう。

update_render理想的には、Deferred を返すAPI よりも優れた API が必要です。Deferred は、コールバックを管理するための統一された構成可能で便利な API を提供します。コールバックは Twisted を使ったプログラミングの中心です。

update_renderクライアント データを取得したら、 に入れるのではなく、Deferredのメソッドを使用する必要があります。を使用することで、Twisted のイベントドリブン システムでうまく動作します。あなた (発信者) がアタッチするコールバックは、結果をクライアントに送信できます。callbackself.client_dataDeferredDeferred

Twisted Web には、応答が近づいていることをサーバーに知らせるためにtwisted.web.server.NOT_DONE_YET、メソッドから戻る必要があるという点で、ちょっとした癖があります。render_GET

非同期的に生成される応答の例については、 Twisted Web In 60 Secondsを参照してください。

于 2012-07-23T19:20:57.853 に答える