如何使用python同时发送两个请求
因此,我遵循了上的指南来创建一个异步web服务 在我的代码中,我有一个函数,它将发送如下请求如何使用python同时发送两个请求,python,python-2.7,twisted,klein-mvc,Python,Python 2.7,Twisted,Klein Mvc,因此,我遵循了上的指南来创建一个异步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")
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的内容?谢谢。您需要做的是使用a而不是
内联回调
。基本上,您提供了一个延迟列表,在每个延迟完成后,将执行一个包含所有延迟结果的最终回调
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()
函数将同时执行请求,然后返回一个延迟的
。这几乎是立即发生的,因此基本上output1
和output2
是同时执行的。然后将延迟项(即output1
和output2
)附加到列表中,并将其传递到DeferredList
,该列表本身返回一个延迟的
。最后,您将回调添加到DeferredList
以处理结果(在本例中,我只是打印结果)。这一切都是在没有使用线程的情况下完成的,在我看来这是最好的部分!希望这是有意义的,如果没有,请评论
附言
如果你需要Klein的进一步帮助,我正在修改这里的文档(希望有一天我会写一篇博文)。请看一些文档(带有.rst
的文件)。我无耻的插件现在结束了:D您可以使用线程或找到一种方法将查询合并为一个查询您的“问题”是您使用的是inlineCallbacks
,它(由于缺少更好的词语)的行为类似于同步代码。所以基本上,output1
必须先生成一个值,然后才能转到output2
。