我正在开发波兰博客圈监控网站,并且正在寻找在 python 中处理大量内容下载的“最佳实践”。
这是工作流程的示例方案:
描述:
我已经对 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 运行新作业。
对我来说听起来不错,但是也许这种任务有一些“最佳实践”,我现在正在重新发明轮子。这就是为什么我在这里发布我的问题。
谢谢!