python - aiohttp 优于 pycurl multi,因为 python 有 gil,切换到 aiohttp 可以获得什么好处?

标签 python curl parallel-processing aiohttp pycurl

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

如果我改用aiohttp,我可以期待什么样的效率提升?

怀疑让我怀疑潜在的改进,因为 python 有 GIL。大部分时间都花在等待请求(网络 IO)上,因此如果我能够以真正的并行方式执行它们,然后在它们进来时对其进行处理,我可以获得很好的加速。

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

谢谢

最佳答案

The global interpreter lock is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once.

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

如果你想更多地了解asyncIO,你需要了解并发和并行之间的区别。这是一个很棒的Go talk about this subject ,但原理是相同的。

因此,即使 python 有 GIL,使用 asyncIO 的性能也会比使用传统线程好得多。 Here are some benchmarks :

enter image description here

关于python - aiohttp 优于 pycurl multi,因为 python 有 gil,切换到 aiohttp 可以获得什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56405355/

相关文章:

python - 多线程Python请求

python - 通过单击 Bootstrap 下拉菜单中的 <a> 链接在 Django 中设置模板语言

python - 如何判断两个元素是否属于同一个列表

curl - 如何允许其他人编辑通过curl上传的slack帖子

c# - 单核cpu上的C#并行和多线程

parallel-processing - 在 Rust 中,是否可以在多个线程之间共享数据而无需静态生命周期?

列表理解中的 Python 语法错误?

c - 无法使用 CURL 发送 HTTPS post 服务器请求

php - cURL 错误 60 - SSL 证书问题 - 无法获取本地颁发者

arrays - 使用 STArray 的 Haskell 并行计算