场景:首先,我需要将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
答案 0 :(得分:0)
使用Subprocess.wait_for_exit()
(返回Future)而不是Subprocess.set_exit_callback()
。然后可以在协程中使用
async def f():
p = Subprocess(cmd)
await p.wait_for_exit()