Python 2.7 如何构建Tornado aynchronous web服务以一次服务单个请求(单例请求服务器)

Python 2.7 如何构建Tornado aynchronous web服务以一次服务单个请求(单例请求服务器),python-2.7,web-services,asynchronous,tornado,Python 2.7,Web Services,Asynchronous,Tornado,您好,我正在尝试构建一个基于Tornado的异步python web服务,对于单个请求,通常需要30分钟以上的处理时间 场景 当我调用GET时,它将启动流程,它应该立即响应,就像流程启动一样 在处理期间,如果应用程序收到另一个GET。它应该响应服务器正在处理请求,请稍后再试。(单例请求服务器) 你能指导我建造这个吗 像这样的方法应该会奏效: import threading import time from tornado import web from tornado.ioloop impo

您好,我正在尝试构建一个基于Tornado的异步python web服务,对于单个请求,通常需要30分钟以上的处理时间

场景

当我调用GET时,它将启动流程,它应该立即响应,就像流程启动一样

在处理期间,如果应用程序收到另一个GET。它应该响应服务器正在处理请求,请稍后再试。(单例请求服务器)


你能指导我建造这个吗

像这样的方法应该会奏效:

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()
在这段代码中,锁实际上是不必要的,因为“is_processing”是一个简单的布尔值。我已经包括了锁,以防您需要更复杂的数据结构来控制后台处理器,我想向您展示如何锁定对该数据结构的访问