为多个网址组织池大量下载

时间:2010-12-05 22:26:57

标签: python asynchronous download gevent

我正在开发波兰博客圈监控网站,我正在寻找处理的“最佳实践” python中的大量内容下载。

以下是工作流程的样本:

http://img577.imageshack.us/img577/2971/scheme.png

说明

我已经对rss feed的数据库进行了分类(大约1000)。每隔一小时左右,如果发布了一些新项目,我应该检查Feed。如果是这样,我应该分析每个新项目。 分析流程处理每个文档的元数据,并下载内部的每个图像。

简化的单线程版本的代码:

for url, etag, l_mod in rss_urls:
    rss_feed = process_rss(url, etag, l_mod) # Read url with last etag, l_mod values
    if not rss:
        continue

    for new_item in rss_feed: # Iterate via *new* items in feed
        element = fetch_content(new_item) # Direct https request, download HTML source
        if not element:
            continue

        images = extract_images(element)
        goodImages = []
        for img in images:
            if img_qualify(img): # Download and analyze image if it could be used as a thumbnail
                goodImages.append(img)

因此,我遍历rss供稿,仅下载包含新商品的供稿。从Feed中下载每个 new 项。下载并分析项目中的每个图像。

HTTR请求出现在以下阶段: - 下载rss xml文档 - 下载在rss上找到的x项 - 下载每个项目的所有图像

我决定尝试python gevent(www.gevent.org)库来处理多个网址内容下载

我想要获得的结果是: - 能够限制外部http请求的数量 - 能够parralel下载所有列出的内容项目。

最好的方法是什么?

我不确定,因为我根本不熟悉parralel编程(这个异步请求可能与parralel编程完全无关)而且我不知道这些任务是怎么做的 是在一个成熟的世界里完成的。

我想到的唯一想法是使用以下技术: - 每45分钟通过cronjob运行处理脚本 - 尝试使用写入的pid进程锁定文件。如果锁定失败,请检查此pid的进程列表。如果找不到pid,可能在某个时刻处理失败,并且可以安全地进行新的pid。 - 通过用于rss feed下载的gevent池运行任务的包装器,在每个阶段(找到新项目)添加新工作到quique下载项目,在每个下载的项目添加图像下载任务。 - 检查当前正在运行的作业的每一秒状态,如果在FIFO模式下有空闲插槽,则从quique运行新作业。

对我来说听起来不错,但也许这种任务有一些“最佳实践”,我现在正在重新发明轮子。 这就是为什么我在这里发布我的问题。

THX!

1 个答案:

答案 0 :(得分:0)

这种方法在初次阅读时听起来不错。此处的示例显示了如何限制并发性https://bitbucket.org/denis/gevent/src/tip/examples/dns_mass_resolve.py