【问题标题】:How to send out two request at the same time with python如何用python同时发出两个请求
【发布时间】:2016-11-17 12:50:11
【问题描述】:

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

【问题讨论】:

  • 您可以使用线程或找到一种方法将查询合并到一个查询中
  • 您的“问题”是您使用的是inlineCallbacks,它(因为没有更好的词)就像同步代码一样。所以基本上output1 必须先产生一个值,然后才能转到output2

标签: python python-2.7 twisted klein-mvc


【解决方案1】:

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

PS

如果您需要有关 Klein 的进一步帮助,我正在努力修改这里的文档 https://github.com/notoriousno/klein-basics(希望这些天我会发表一篇博文)。请查看一些文档(带有.rst 的文件)。我的无耻插件现在结束了:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2022-10-18
    • 1970-01-01
    相关资源
    最近更新 更多