簡體   English   中英

python龍卷風獲取多個異步httprequest的響應

[英]python tornado get response of multiple async httprequest

我有一個url_handler列表,我想使用龍卷風發出異步​​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

我希望我的問題得到很好的解釋

因為您知道AsyncHTTPClient是異步的,所以這意味着請求將在background中運行。

因此,當for循環完成時,這並不意味着所有請求也都已完成-即使循環完成,它們仍在后台運行。

這就是self.data為空的原因,因為請求尚未完成。


如何解決這個問題

如您所知,在完成每個請求之后,將調用handle_response回調。 當所有請求完成時,您可以從此回調中調用do_something函數。 像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM