2017-05-16 5 views
0

こんにちは私は、通常、単一のリクエストに対して30分以上の処理時間を要する非同期のpython Webサービスを構築しようとしています。私はGETを呼び出すと、一度に1つのリクエストを処理するためにTornadoの非同期Webサービスを構築する方法(シングルトンリクエストサーバー)

シナリオ

、それはプロセスが開始ようにそれが戻ってすぐに対応すべきプロセスを開始します。

処理中にアプリケーションが別のGETを受信した場合。サーバーが要求を処理していると応答する必要があります。しばらくしてからもう一度お試しください。 (シングルトンリクエストサーバー)

私はこれをビルドすることができます!

答えて

0

このような何かが動作するはずです:「is_processingは」単純ブールあるので

import threading 
import time 

from tornado import web 
from tornado.ioloop import IOLoop 

lock = threading.Lock() 
is_processing = False 


def background_process(): 
    global is_processing 

    with lock: 
     is_processing = True 

    # You should never call sleep within a Tornado request handler, but it's ok 
    # on a background thread. 
    time.sleep(10) 

    with lock: 
     is_processing = False 


class MyHandler(web.RequestHandler): 
    def get(self): 
     with lock: 
      p = is_processing 

     if p: 
      self.write("Please try again") 
     else: 
      t = threading.Thread(target=background_process) 
      t.start() 
      self.write("Started processing") 


def make_app(): 
    return web.Application([ 
     (r"/", MyHandler), 
    ]) 


if __name__ == "__main__": 
    app = make_app() 
    app.listen(8888) 
    IOLoop.current().start() 

ロックは、このコードでは実際には必要ではありません。バックグラウンドプロセッサを制御するためのより複雑なデータ構造が必要な場合に備えてロックを含めました。そのデータ構造へのアクセスをロックする方法を示したいと思います。

関連する問題