如何用python同时发出两个请求

时间:2016-07-14 14:31:08

标签: python python-2.7 twisted klein-mvc

所以我在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的内容?感谢。

1 个答案:

答案 0 :(得分:2)

您需要做的是使用DeferredList代替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基本上同时执行。然后将延迟(即output1output2)附加到list中,并将其传递到DeferredList,其本身返回Deferred。最后,您向DeferredList添加回调以对结果执行某些操作(在本例中,我只是打印它们)。这一切都是在不使用线程的情况下完成的,这是我认为最好的部分!希望这是有道理的,如果没有,请发表评论。

PS

如果您需要有关Klein的进一步帮助,我正在努力修改此处的文档https://github.com/notoriousno/klein-basics(希望我会在其中一天撰写博客文章)。请查看一些文档(包含.rst的文件)。我的无耻插头现在已经结束了:D