python - aiohttp over pycurl multi,因为python有gil,切换到aiohttp有什么好处?
问题描述
在我正在研究的爬虫中。它使用 pycurl multi 发出请求。
如果我切换到 aiohttp,我可以期待什么样的效率提升?
由于 python 拥有 GIL,怀疑主义让我怀疑潜在的改进。大部分时间都花在等待请求(网络 IO)上,所以如果我能以真正的并行方式处理它们,然后在它们进入时处理它们,我可以获得很好的加速。
有没有人经历过这个并且可以提供一些见解?
谢谢
解决方案
全局解释器锁是一个互斥锁,可以保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。
这意味着这会影响多线程代码的性能。AsyncIO 更多的是处理并发请求而不是并行。使用 AsyncIO,即使使用单线程循环,您的代码也将能够处理更多请求,因为网络 IO 将是异步的。这意味着在协程获取网络资源期间,它将“暂停”并且不会锁定它正在运行的线程并允许其他协程执行。asyncIO 的主要思想是,即使使用单线程,您也可以让 CPU 不断地执行计算,而不是等待网络 IO。
如果你想了解更多关于 asyncIO 的知识,你需要了解并发和并行之间的区别。这是一个关于这个主题的精彩Go 演讲,但原理是一样的。
因此,即使 python 有 GIL,使用 asyncIO 的性能也将远远优于使用传统线程。以下是一些基准:
推荐阅读
- java - 如何解决“找不到符号方法”?
- c# - 如果 Windows 任务栏具有当前焦点,则 LoadKeyboardLayout() 无法更改键盘布局
- javascript - JavaScript:比较 2 个 UNIX 时间戳返回意外结果
- android - 无法解决 JitPack 版本的传递依赖
- asynchronous - 如何展平和收集期货迭代器到结果?
- powerbi - 功率查询 (powerbi) 将面板数据(横截面时态数据)转换为带有添加时态列的横截面结构
- vue.js - Vue路由器:在获取数据后运行beforeEach
- typescript - 如何将数字[]与仅包含数字的接口匹配
- next.js - Bootstrap 5 Popover(Next.js)“找不到名称引导程序”
- javascript - Puppeteer:一个一个地抓取多个网址