python 如何同时发出两个请求

How to send out two request at the same time with python

所以我按照 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 的内容?谢谢

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

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

PS

如果您需要有关 Klein 的进一步帮助,我正在努力修改此处的文档 https://github.com/notoriousno/klein-basics(希望我能在这些日子里写一篇博客 post)。请查看一些文档(带有 .rst 的文件)。我的无耻插件到此结束:D