我有一个用Flask编写的REST API并使用Tornado Web服务器。
当请求进入时,我使用UPDATE emp
SET sal=sal + psal,
comm = COALESCE(comm, 0) + COALESCE(pcomm, 0)
WHERE empno = peno;
执行长时间运行的shell命令。
有没有办法在shell命令运行时继续处理新请求,并在shell命令完成后返回结果。
我在想
tornado.process.Subprocess
但这似乎不起作用:
我只是在提出请求时得到from tornado import gen
from tornado.process import Subprocess
@gen.coroutine
def callSubProcess(commandString):
p = Subprocess(commandString)
yield p.wait_for_exit()
raise gen.Return(someResult)
@app.route(url, methods=['POST'])
@gen.coroutine
def process():
result = yield callSubProcess(commandString)
raise gen.Return(result)
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
。这有什么问题?
答案 0 :(得分:0)
https://github.com/celery/celery正是您所需要的,
Celery允许您异步执行shell命令,因此您将能够处理所有即将发出的请求。
答案 1 :(得分:0)
要使用协同程序,您必须使用tornado.web.Application
,而不是tornado.wsgi.WSGIContainer
。 Tornado并没有神奇地为像Flask这样的WSGI框架提供处理异步操作和协同程序的能力。