【问题标题】:python tornado get response of multiple async httprequestpython tornado获取多个异步httprequest的响应
【发布时间】:2018-02-27 16:44:42
【问题描述】:

我有一个 url_handler 列表,我想使用 tornado 进行异步 httprequest。当所有响应结构到达时,我需要将它用于其他目标。 这是我的代码的一个简单示例:

(...)
self.number = 0
self.counter = 0
self.data = {}
(...)
@tornado.web.asynchronous
def post(self):
    list_url = [url_service1, url_service2]
    self.number = len(list_url)
    http_client = AsyncHTTPClient()
    for service in list_url:
        request = tornado.httpclient.HTTPRequest(url=service, method='POST', headers={'content-type': 'application/json'}, body=json.dumps({..params..}))
        http_client.fetch(request, callback=self.handle_response)

    # Loop for is finished. Use self.data for example in other funcions...
    # if i print(self.data) i have empty dict...
    # do_something(self.data)



def handle_response(self,response):
    if response.error:
        print("Error")
    else:
        self.counter = self.counter + 1
        print("Response {} / {} from {}".format(self.counter, self.number, response.effective_url))
        self.data[response.effective_url] = json_decode(response.body)
    # number is 2
    if self.counter == self.number:
        print("Finish response")

def do_something(data):
    # code with data parameter

我希望我的问题得到很好的解释

【问题讨论】:

  • 代码看起来没问题。有什么问题?
  • 行“print(self.data)”打印空字典。我想在 for 循环中获取异步请求后的所有响应,并将它们用于其他功能。例如: for (...): ... ... fetch(...) do_something(self.data)--> self.data 为空!回调“handle_response”完成后,如何在全局变量中获取结果?函数 do_something 在回调之外。

标签: python http asynchronous request tornado


【解决方案1】:

由于您知道AsyncHTTPClient 是异步的,这意味着请求将在后台 中运行。

所以,当for 循环结束时,这并不意味着所有请求也都结束了——即使循环结束,它们也在后台运行。

这就是self.data 为空的原因,因为请求尚未完成。


如何解决这个问题

如您所知,每个请求完成后都会调用handle_response 回调。当所有请求完成后,您可以从此回调中调用do_something 函数。像这样:

def handle_response(...):
    ...
    if self.counter == self.number:
        self.do_something(self.data)
        print("Finish response")

【讨论】:

  • @LucaPalombella 是的,如果您正在使用这样的回调,那么这是编写结果的好地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
相关资源
最近更新 更多