【发布时间】: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