2

因此,我按照http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted-klein/上的指南来创建异步 Web 服务。

在我的代码中,我有一个函数可以发送请求,例如

def query(text):
    resp = yield treq.get("http://api.Iwanttoquery")
    content = yield treq.content(resp)
    returnValue(content)

@inlineCallbacks
def caller():
    output1 = yield query("one")
    output2 = yield query("two")

由于对 api 的每次查询通常需要大约 3 秒,使用我当前的代码,结果会在 6 秒后返回。我想知道有没有办法同时发送两个查询,所以 3 秒后我可以得到 output1 和 output2 的内容?谢谢。

4

1 回答 1

2

您需要做的是使用 aDeferredList而不是inlineCallbacks. 基本上,您提供了一个延迟列表,并且在每个完成后,将执行一个包含所有延迟结果的最终回调。

import treq
from twisted.internet import defer, reactor

def query(text):
    get = treq.get('http://google.com')
    get.addCallback(treq.content)
    return get

output1 = query('one')
output2 = query('two')

final = defer.DeferredList([output1, output2])  # wait for both queries to finish
final.addCallback(print)    # print the results from all the queries in the list

reactor.run()

每个query()函数将同时执行请求,然后返回一个Deferred. 这几乎立即发生,所以基本上output1output2同时执行。然后你在 a 中附加延迟(即output1output2list并将其传递给DeferredList,它本身返回 a Deferred。最后,你添加一个回调来对DeferredList结果做一些事情(在这种情况下我只是打印它们)。这一切都是在不使用线程的情况下完成的,这是我认为最好的部分!希望这是有道理的,如果没有,请发表评论。

附言

如果您需要 Klein 的进一步帮助,我正在修改此处的文档https://github.com/notoriousno/klein-basics(希望我会在这些天发表一篇博文)。请查看一些文档(带有 的文件.rst)。我的无耻插件现在结束了:D

于 2016-07-15T00:04:34.377 回答