子流程Tornado捕获退出状态

时间:2018-01-16 08:22:49

标签: python-3.x subprocess tornado

场景:首先,我需要将db中的状态更新为“pending”,同时将状态返回给user。然后子进程将在后台运行,因为我将time.sleep(30)放在dummy.py中,所以需要30秒。之后,我必须将db中的状态更新为“completed”。我正在尝试使用龙卷风制作非阻塞功能。 我的问题:如果使用yield完成Subprocess,我已经捕获了。如果yield结果为0,我假设Subprocess已经完成。我知道我的逻辑有些不对劲。如果Subprocess(Tornado)以正确的方式完成,我该如何捕获? 我目前的代码是:

class MainHandler(tornado.web.RequestHandler):
@coroutine
def get(self, id):
    print ("TORNADO ALERT")
    self.write("Pending")
    #If ID in DB, UPDATE DB
    #Update Status to Pending 
    self.flush()
    res =yield self._work()

    self.write(res)

@coroutine
def _work(self):
    p = Subprocess(['python', 'dummy.py'])
    f = Future()
    p.set_exit_callback(f.set_result)
    h = yield f
    print (">>> ",h)
    if h == 0:
        print("DB Updated")
        #Update Status to Completed
    raise Return(" Completed ")

我的导入如下:

from tornado.concurrent import Future
from tornado.process import Subprocess

1 个答案:

答案 0 :(得分:0)

使用Subprocess.wait_for_exit()(返回Future)而不是Subprocess.set_exit_callback()。然后可以在协程中使用

async def f():
    p = Subprocess(cmd)
    await p.wait_for_exit()