[英]Python with Tornado: How to get fetch response in async functions?
[英]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.