试图将协同程序的概念应用于现有的代码
我有一个非常基本的站点地图刮板使用请求和lxml在Python 3中构建。其目的是建立一个特定网站的URL数据库。目前它的工作方式如下:为每个顶级站点地图进行挖掘,我触发一个芹菜任务。在此任务中,解析站点地图以检查它是否是sitemapindex
或urlset
。 Sitemapindexes分层指向其他站点地图,而urlsets指向末端URL - 它们就像树中的叶子。试图将协同程序的概念应用于现有的代码
如果站点地图被识别为sitemapindex
,它包含的每个URL都指向一个子站点地图,它将在单独的线程中处理,从头开始重复该过程。
如果站点地图标识为urlset
,则其中的URL存储在数据库中,并且此分支完成。
我一直在阅读关于协程,asyncio,gevent,async/await等,我不确定我的问题是否适合使用这些技术开发,或者性能是否会提高。
据我所知,corroutines在处理IO操作时很有用,以避免在IO操作正在运行时阻塞执行。不过,我也读过它们本质上是单线程的,所以我明白,当代码开始解析IO操作中的XML响应时,就没有并行化。
因此,本质上问题是,我怎么才能使用coroutines/asyncio/insert_similar_technology来实现这个?我会从性能方面受益吗?
编辑:顺便说一句,我知道Twisted有一个专门的SitemapSpider,以防万一有人建议使用它。
对不起,我不知道我完全理解你的代码是如何工作的,但这里的一些想法:
请问您的程序下载多个URL?
如果是,可以使用asyncio来减少程序等待网络I/O的时间。如果没有,asyncio不会帮助你。
您的程序如何下载网址?
如果一个接一个,那么asyncio可以帮助你更快地抓住它们。另一方面,如果你已经平行地抓住它们(例如用不同的线程),你不会从asyncio中获得太多好处。
我建议你阅读我关于asyncio here的回答。它很简短,它可以帮助您理解为什么以及何时使用异步代码。