首页 > 解决方案 > aiohttp over pycurl multi,因为python有gil,切换到aiohttp有什么好处?

问题描述

在我正在研究的爬虫中。它使用 pycurl multi 发出请求。

如果我切换到 aiohttp,我可以期待什么样的效率提升?

由于 python 拥有 GIL,怀疑主义让我怀疑潜在的改进。大部分时间都花在等待请求(网络 IO)上,所以如果我能以真正的并行方式处理它们,然后在它们进入时处理它们,我可以获得很好的加速。

有没有人经历过这个并且可以提供一些见解?

谢谢

标签: pythoncurlparallel-processingaiohttppycurl

解决方案


全局解释器锁是一个互斥锁,可以保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。

这意味着这会影响多线程代码的性能。AsyncIO 更多的是处理并发请求而不是并行。使用 AsyncIO,即使使用单线程循环,您的代码也将能够处理更多请求,因为网络 IO 将是异步的。这意味着在协程获取网络资源期间,它将“暂停”并且不会锁定它正在运行的线程并允许其他协程执行。asyncIO 的主要思想是,即使使用单线程,您也可以让 CPU 不断地执行计算,而不是等待网络 IO。

如果你想了解更多关于 asyncIO 的知识,你需要了解并发和并行之间的区别。这是一个关于这个主题的精彩Go 演讲,但原理是一样的。

因此,即使 python 有 GIL,使用 asyncIO 的性能也将远远优于使用传统线程。以下是一些基准

在此处输入图像描述


推荐阅读