我试图设置一个运行终端命令并在完成时返回输出的扭曲项目。但是,当客户端在端口9000上启动请求时,twisted会阻止该端口上的所有其他请求,并在初始请求完成后处理它们。
是否可以使用twisted来终止所有先前的请求并仅运行最新的请求?
编辑:
我尝试过以下方法: `
def _query(script):
d = utils.getProcessOutput('/bin/sh', script)
def _parse(output):
return output
d.addCallback(_parse)
return d
output = _query('script.sh')
print output
但是我只是在打印输出时得到一个延迟对象。脚本可能需要一些时间才能完成,但它似乎没有等待它应该的时间。
答案 0 :(得分:1)
output = _query('script.sh')
print output
由于_query
返回Deferred
,因此无法执行您想要的操作。您需要运行脚本的输出,该输出可用作Deferred
的结果。 Deferred
的目的是在您的代码可用时将结果提供给 。为此,您需要将回调附加到Deferred
。您的代码中有一个早期示例:
def _parse(output):
return output
d.addCallback(_parse)
但是这个回调没有做任何事情(也就是说,你可以删除这三行而不改变程序的行为)。
相反,您要做的是附加一个以某种方式处理脚本输出的回调。由于您将flask
标记附加到问题中,我认为您有一个烧瓶Web服务器,并且您希望在收到请求时运行此代码,然后在对该请求的响应中生成脚本输出。
Flask采用阻塞范式,通过多线程或多处理实现并发。在这种情况下使用Twisted来做你想做的事情将是一个中等挑战。这是可能的(例如,使用Crochet),但不清楚它是否特别有用。
您可能需要考虑将Flask替换为Klein或将Twisted替换为一些标准的阻塞库调用。