Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python同时发送两个请求_Python_Python 2.7_Twisted_Klein Mvc - Fatal编程技术网

如何使用python同时发送两个请求

如何使用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")

因此,我遵循了上的指南来创建一个异步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的内容?谢谢。

您需要做的是使用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