8

基本的にファイルをユーザーに提供するPython + Tornadoを使用してWebアプリケーションを作成しています。データベースがありません。

ファイルは、利用可能な場合は直接取得して提供されるか、利用できない場合はその場で生成されます。

一部のファイルは既に利用可能であり、他のファイルは生成する必要があるため (したがって、待機する必要があり、他のユーザーをブロックしたくありません)、クライアントを非同期で提供したいと考えています。

ファイルの選択または生成を管理するクラスがあり、Tornado から呼び出すだけです。

それを達成するための最良の方法(CPUとRAMで最も効率的)は何ですか?スレッドを使用する必要がありますか? サブプロセス?このような単純なgen.Task ?

また、実装を Google App Engine で動作させたいと考えています (サブプロセスの生成が許可されていないと思いますか?)。

私は非同期 Web サービスに比較的慣れていないので、どんな助けも大歓迎です。

4

2 に答える 2

11

私は自分の質問に対する答えを見つけました: genTask の例は確かに非同期呼び出しを実装するための最良の方法です。これは、例がPython のコルーチンを使用しているという事実によるものです。 yieldはジェネレーターの値を返すためにのみ使用されると思いました。

具体例:

class MyHandler(tornado.web.RequestHandler):

    @asynchronous
    @gen.engine
    def get(self):
        response = yield gen.Task(self.dosomething, 'argument')

ここで重要なのは、次の 2 つの組み合わせです。

  • yield、実際にはコルーチン (または非常に効率的で、並行処理に非常に適した擬似スレッド) を生成します。 http://www.python.org/dev/peps/pep-0342/

  • gen.Task()これは非ブロッキング (非同期) 関数です。ブロッキング関数でコルーチンを生成すると非同期にならないためです。gen.Task()特に Python のコルーチン構文を操作するために、Tornado によって提供されます。詳細情報: http://www.tornadoweb.org/documentation/gen.html

したがって、コルーチンを使用した Python での非同期呼び出しの標準的な例は次のとおりです。

response = yield non_blocking_func(**kwargs)
于 2012-11-08T23:19:44.510 に答える