1

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

这是工作流程的示例方案:

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

描述:

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

代码的简化单线程版本:

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 提要,只下载带有新项目的提要。从提要下载每个新项目。下载并分析项目中的每个图像。

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

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

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

最好的方法是什么?

我不确定,因为我对并行编程完全不熟悉(这个异步请求可能与并行编程完全无关)而且我不知道在成熟的世界中这些任务是如何完成的。

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

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

谢谢!

4

1 回答 1

0

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

于 2011-03-01T16:53:06.293 回答