Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 尝试将协同路由的概念应用于现有代码_Python 3.x_Python Asyncio - Fatal编程技术网

Python 3.x 尝试将协同路由的概念应用于现有代码

Python 3.x 尝试将协同路由的概念应用于现有代码,python-3.x,python-asyncio,Python 3.x,Python Asyncio,我在Python3中使用请求和lxml构建了一个非常基本的站点地图刮板。目的是建立一个特定网站URL的数据库。目前,它的工作方式如下:对于每个要刮取的顶级站点地图,我触发一个芹菜任务。在此任务中,将解析站点地图以检查它是sitemapindex还是urlset。SiteMapIndex按层次指向其他站点地图,而urlsets则指向结束URL——它们就像树中的叶子 如果站点地图被标识为sitemapindex,则它包含的每个指向子站点地图的URL将在单独的线程中处理,并从头开始重复该过程 如果站点

我在Python3中使用请求和lxml构建了一个非常基本的站点地图刮板。目的是建立一个特定网站URL的数据库。目前,它的工作方式如下:对于每个要刮取的顶级站点地图,我触发一个芹菜任务。在此任务中,将解析站点地图以检查它是
sitemapindex
还是
urlset
。SiteMapIndex按层次指向其他站点地图,而urlsets则指向结束URL——它们就像树中的叶子

如果站点地图被标识为
sitemapindex
,则它包含的每个指向子站点地图的URL将在单独的线程中处理,并从头开始重复该过程

如果站点地图被标识为
urlset
,则其中的URL将存储在数据库中,此分支将完成

我一直在阅读有关协程、asyncio、gevent、async/await等的内容,我不确定我的问题是否适合使用这些技术开发,或者性能是否会得到提高

据我所知,在处理IO操作时,腐蚀非常有用,以避免在IO操作运行时阻塞执行。但是,我也读到过,它们本质上是单线程的,因此我知道当代码开始解析来自IO操作的XML响应时,没有并行化

所以本质上的问题是,我如何使用协程/异步IO/插入技术来实现这一点?在性能方面,我会从中受益吗


编辑:顺便说一下,我知道Twisted有一个专门的SitemapSpider,以防有人建议使用它

对不起,我不确定我是否完全理解您的代码是如何工作的,但这里有一些想法:

您的程序下载多个URL吗?

如果是,可以使用asyncio来减少程序等待网络I/O的时间。如果不是,asyncio对您没有帮助

您的程序如何下载URL?

如果一个接一个,那么asyncio可以帮助您更快地获取它们。另一方面,如果您已经并行地获取它们(例如,使用不同的线程),那么您将不会从asyncio中获得太多好处

我建议您阅读我关于asyncio的回答。它很短,可以帮助您理解为什么以及何时使用异步代码