在我的当前应用程序中,我使用龙卷风AsyncHttpClient向网站发出请求。流程是复杂的,处理来自前一个请求的响应会导致另一个请求。
实际上,我下载了一篇文章,然后分析并下载文章中提到的图片。
困扰我的是,在我的日志中,我清楚地看到了一条消息,表明已经发出了.fetch() on photo,但是没有发出任何实际的HTTP请求,就像Wireshark中所闻的那样。
我试过修改max_client_count和Curl/Simple客户端,但是bahvior总是一样的--直到所有文章都被下载,而不是实际发布照片请求。怎么能改变这一切?
upd.一些伪码
@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)当它打印出来的时候,我要下载那张照片,没有人提出真正的要求!相反,它继续下载更多的文章,并加入更多的照片,直到所有的文章都被下载,只有这样,所有的照片才会被批量地请求。
发布于 2014-12-15 22:09:54
AsyncHTTPClient有一个队列,您将立即在process_articles中填充它("Enqueue但不要等待一个队列“)。当第一篇文章被处理时,它的照片将在队列的末尾,在所有其他文章之后。
如果您在yield self.fetch_and_process中使用add_callback而不是在process_articles中使用add_callback,您将在文章和它们的照片之间交替使用,但是一次只能下载一件东西。为了在文章和照片之间保持平衡,同时仍然一次下载多个东西,请考虑使用toro包进行同步原语。example.html中的示例类似于您的用例。
https://stackoverflow.com/questions/27469581
复制相似问题