调用子进程时Python异步请求处理

时间:2017-03-28 19:02:26

标签: python subprocess tornado popen

我有一个用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() 。这有什么问题?

2 个答案:

答案 0 :(得分:0)

https://github.com/celery/celery正是您所需要的,

Celery允许您异步执行shell命令,因此您将能够处理所有即将发出的请求。

答案 1 :(得分:0)

要使用协同程序,您必须使用tornado.web.Application,而不是tornado.wsgi.WSGIContainer。 Tornado并没有神奇地为像Flask这样的WSGI框架提供处理异步操作和协同程序的能力。