【问题标题】:Subprocess Tornado capture exit status子进程 Tornado 捕获退出状态
【发布时间】:2018-06-24 21:36:04
【问题描述】:

场景:首先,我需要将数据库中的状态更新为“待处理”,同时将状态返回给用户。然后子进程将在后台运行,这将需要 30 秒,因为我已将 time.sleep(30) 放入 dummy.py 中。之后,我必须将数据库中的状态更新为“已完成”。我正在尝试使用龙卷风制作非阻塞功能。 我的问题:我已经捕获了 Subprocess 是否通过使用 yield 完成。如果 yield result 为 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

【问题讨论】:

标签: python-3.x subprocess tornado


【解决方案1】:

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

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

【讨论】:

  • 我想在子进程完成后更新数据库。 def _work(self): p = Subprocess([cmd]) f = Future() p.wait_for_exit(f.set_result) #if p has finished: #Update DB raise Return ("Hello World") 我在那里遇到了困难。代码流应该是,在 Subprocess 完成工作时向用户返回“Hello World”。完成后,更新数据库。
  • 请更新您的问题(不仅仅是评论),详细说明您正在做什么以及它是如何失败的。请注意,您必须在此处使用协程或回调;普通函数不起作用。
  • 代码对我来说看起来不错。我仍然建议使用 wait_for_exit 而不是 set_exit_callback(future.set_result),但它们应该是等价的。你说“我知道我的逻辑有些不对劲”;你怎么会知道这事?究竟发生了什么,而您的期望是什么?
  • 我之所以这么说是因为我是 Tornado 的新手,尤其是,我真的不知道如何使用“未来”。但是,代码正在按预期工作。这只是我的直觉。感谢您帮助@Ben。很高兴知道有人在新框架和编程语言方面提供帮助。
猜你喜欢
  • 2015-02-03
  • 2014-11-01
  • 2020-02-27
  • 1970-01-01
  • 2014-07-06
  • 2015-09-04
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多