所以我在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的内容?感谢。
答案 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
。这几乎立即发生,因此output1
和output2
基本上同时执行。然后将延迟(即output1
和output2
)附加到list
中,并将其传递到DeferredList
,其本身返回Deferred
。最后,您向DeferredList
添加回调以对结果执行某些操作(在本例中,我只是打印它们)。这一切都是在不使用线程的情况下完成的,这是我认为最好的部分!希望这是有道理的,如果没有,请发表评论。
如果您需要有关Klein的进一步帮助,我正在努力修改此处的文档https://github.com/notoriousno/klein-basics(希望我会在其中一天撰写博客文章)。请查看一些文档(包含.rst
的文件)。我的无耻插头现在已经结束了:D