首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么龙卷风中的AsyncHTTPClient不立即发送请求?

为什么龙卷风中的AsyncHTTPClient不立即发送请求?
EN

Stack Overflow用户
提问于 2014-12-14 13:04:57
回答 1查看 751关注 0票数 1

在我的当前应用程序中,我使用龙卷风AsyncHttpClient向网站发出请求。流程是复杂的,处理来自前一个请求的响应会导致另一个请求。

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

困扰我的是,在我的日志中,我清楚地看到了一条消息,表明已经发出了.fetch() on photo,但是没有发出任何实际的HTTP请求,就像Wireshark中所闻的那样。

我试过修改max_client_count和Curl/Simple客户端,但是bahvior总是一样的--直到所有文章都被下载,而不是实际发布照片请求。怎么能改变这一切?

upd.一些伪码

@VictorSergienko我在Linux上,所以默认情况下,我猜是使用了EPoll版本。整个系统过于复杂,但归根结底是:

代码语言:javascript
运行
复制
@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)

当它打印出来的时候,我要下载那张照片,没有人提出真正的要求!相反,它继续下载更多的文章,并加入更多的照片,直到所有的文章都被下载,只有这样,所有的照片才会被批量地请求。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-15 22:09:54

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

如果您在yield self.fetch_and_process中使用add_callback而不是在process_articles中使用add_callback,您将在文章和它们的照片之间交替使用,但是一次只能下载一件东西。为了在文章和照片之间保持平衡,同时仍然一次下载多个东西,请考虑使用toro包进行同步原语。example.html中的示例类似于您的用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27469581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档