2

アプリが応答を送信したら、GAE に別のことをさせたいと思います。

ハンドラーは次のようになります。

class FooHandler(webapp.RequestHandler):
    def post(self):
        self.response.out.write('Bar')
        send_response()     # this is where I need help!
        do_something_else() # at this point, the response should have been sent

なぜ私がこれをやろうとしているのか疑問に思っている場合:

GAE のサンドボックス環境では許可されていない、スレッドのような動作が必要です。したがって、関数は応答を気にせずにいくつかの要求を送信します。各要求は、時間のかかる操作 (リソースの取得) を開始し、結果をデータストアに保存します。データストアでは、最初の関数で使用できます。

注: 要求ハンドラー応答を送信する必要があります。何も指定しない場合は、post関数が完了するのを待ってから、デフォルトのヘッダーを返します (もちろん、これは私が探している動作ではありません)。

それが役立つ場合、解決策はカスタムwsgiミドルウェアを使用することかもしれませんが、それがどのように機能するかはわかりません(まだ)...

4

4 に答える 4

9

たぶん、 Task Queuesを使用できます。

于 2010-01-15T05:57:19.477 に答える
2

すでに述べたように、タスクキューまたは遅延APIを使用できます。別のオプションは、この講演のセクションの終わりに向かってRafe Kaplanによって概説されています。結果フック関数を使用して非同期API呼び出しを実行し、結果を処理できます。結果フックは、応答、呼び出しが終了したときに呼び出されます。ユーザーに返されます!

于 2010-01-19T12:15:22.197 に答える
1

WSGI レイヤーにアクセスできると仮定すると、WSGI アプリケーションをラップして、応答が送信されたときに実行されるコールバックを提供できます。これを行う方法については、次を参照してください。

http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

これは mod_wsgi のドキュメントからのものですが、リクエストの最後でのクリーンアップの例は、WSGI 準拠のスタックで機能するはずです。

于 2010-01-15T05:49:51.877 に答える
-1

実際にスレッドが必要な場合は、RequestHandler が返されたときに GAE がその応答を送信することはできません。別のホスティング会社で Web アプリケーションを作成する必要があります。

于 2010-01-15T05:57:03.497 に答える