gpt4 book ai didi

python tornado 获取多个异步httprequest的响应

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:31 26 4
gpt4 key购买 nike

我有一个 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

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

最佳答案

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

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

这就是为什么 self.data 是空的,因为请求还没有完成。


如何解决这个问题

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

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

关于python tornado 获取多个异步httprequest的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com