使用Tornado,我有一个POST请求,需要很长时间,因为它向另一个API服务发出许多请求并处理数据。这可能需要几分钟才能完全完成。我不希望这会阻止整个web服务器响应其他请求,而它目前正是这样做的
我在这里查看了多个线程,但它们通常都有8年的历史,并且代码不再有效,因为tornado从tornado.gen中删除了“引擎”组件
有没有一种简单的方法来启动这个长时间的get调用,而不让它在这个过程中阻塞整个web服务器?我能在密码里说些什么吗。。“提交POST响应并使用此函数,而不阻止任何并发服务器请求获得即时响应”
例如: main.py
def make_app():
return tornado.web.Application([
(r"/v1", MainHandler),
(r"/v1/addfile", AddHandler, dict(folderpaths = folderpaths)),
(r"/v1/getfiles", GetHandler, dict(folderpaths = folderpaths)),
(r"/v1/getfile", GetFileHandler, dict(folderpaths = folderpaths)),
])
if __name__ == "__main__":
app = make_app()
sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0)
tornado.process.task_id()
server = tornado.httpserver.HTTPServer(app)
server.add_sockets(sockets)
tornado.ioloop.IOLoop.current().start()
addHandler.py
class AddHandler(tornado.web.RequestHandler):
def initialize(self, folderpaths):
self.folderpaths = folderpaths
def blockingFunction(self):
time.sleep(320)
post("AWAKE")
def post(self):
user = self.get_argument('user')
folderpath = self.get_argument('inpath')
outpath = self.get_argument('outpath')
workflow_value = self.get_argument('workflow')
status_code, status_text = validateInFolder(folderpath)
if (status_code == 200):
logging.info("Status Code 200")
result = self.folderpaths.add_file(user, folderpath, outpath, workflow_value)
self.write(result)
self.finish()
#At this point the path is validated.
#POST response should be send out. Internal process should continue, new
#requests should not be blocked
self.blockingFunction()
其想法是,如果输入参数得到验证,则应发送POST响应。 然后应启动内部进程(blockingFunction()),该进程不应阻止Tornado服务器处理另一个API POST请求
我尝试将(blockingFunction())定义为async,这允许我处理多个并发的用户请求-但是有一个关于async方法缺少“wait”的警告
欢迎任何帮助。多谢各位
谢谢@xyres
进一步阅读:https://www.tornadoweb.org/en/stable/faq.html
相关问题 更多 >
编程相关推荐