我正在开发波兰博客圈监控网站,我正在寻找处理的“最佳实践” python中的大量内容下载。
以下是工作流程的样本:
说明
我已经对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!
答案 0 :(得分:0)
这种方法在初次阅读时听起来不错。此处的示例显示了如何限制并发性https://bitbucket.org/denis/gevent/src/tip/examples/dns_mass_resolve.py