gpt4 book ai didi

python - 为什么Tornado中的AsyncHTTPClient不立即发送请求?

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:26 25 4
gpt4 key购买 nike

在我当前的应用程序中,我使用 Tornado AsyncHttpClient 向网站发出请求。该流程很复杂,处理先前请求的响应会导致另一个请求。

实际上,我下载了一篇文章,然后分析它并下载其中提到的图像

令我困扰的是,在我的日志中,我清楚地看到一条消息,表明照片 URL 上的 .fetch() 已发出,但没有发出实际的 HTTP 请求,如 中嗅探的那样Wireshark

我尝试修改 max_client_count 和 Curl/Simple HTTP 客户端,但 bahvior 始终相同 - 直到所有文章下载完毕,才真正发出照片请求。如何改变这一点?

更新。一些伪代码

@VictorSergienko 我使用的是 Linux,所以默认情况下,我猜使用 EPoll 版本。整个系统太复杂,但归结为:

@gen.coroutine
def fetch_and_process(self, url, callback):
body = yield self.async_client.fetch(url)
res = yield callback(body)
return res

@gen.coroutine
def process_articles(self,urls):
wait_ids=[]
for url in urls:
#Enqueue but don't wait for one
IOLoop.current().add_callback(self.fetch_and_process(url, self.process_article))
wait_ids.append(yield gen.Callback(key=url))
#wait for all tasks to finish
yield wait_ids

@gen.coroutine
def process_article(self,body):
photo_url=self.extract_photo_url_from_page(body)
do_some_stuff()
print('I gonna download that photo '+photo_url)
yield self.download_photo(photo_url)

@gen.coroutine
def download_photo(self, photo_url):
body = yield self.async_client.fetch(photo_url)
with open(self.construct_filename(photo_url)) as f:
f.write(body)

当它打印时我要下载那张照片没有提出实际请求!相反,它会继续下载更多文章并排队更多照片,直到下载所有文章,然后才批量请求所有照片

最佳答案

AsyncHTTPClient 有一个队列,您可以在 process_articles 中立即填充该队列(“入队但不要等待”)。当第一篇文章处理完时,它的照片将排在所有其他文章之后的队列末尾。

如果您在 process_articles 中使用 yield self.fetch_and_process 而不是 add_callback,您将在文章及其照片之间交替,但一次只能下载一项内容。要保持文章和照片之间的平衡,同时仍一次下载多个内容,请考虑使用 toro 包进行同步原语。 http://toro.readthedocs.org/en/stable/examples/web_spider_example.html 中的示例与您的用例类似。

关于python - 为什么Tornado中的AsyncHTTPClient不立即发送请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469581/

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