aiohttp over pycurl multi,因为 python 有 gil,切换到 aiohttp 有什么好处?
aiohttp over pycurl multi, since python has the gil, what benefits do i get by switching to aiohttp?
在我正在研究的爬虫中。它使用 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 将是异步的。这意味着在协程获取网络资源期间,它将 "pause" 而不是锁定它 运行 的线程并允许其他协程执行。 asyncIO 的主要思想是,即使使用单个线程,您也可以让 CPU 不断执行计算,而不是等待网络 IO。
如果你想更多地了解asyncIO,你需要了解并发和并行的区别。这是一个很好的Go talk about this subject,但原理是一样的。
因此,即使 python 有 GIL,使用 asyncIO 的性能也会比使用传统线程好得多。 Here are some benchmarks:
在我正在研究的爬虫中。它使用 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 将是异步的。这意味着在协程获取网络资源期间,它将 "pause" 而不是锁定它 运行 的线程并允许其他协程执行。 asyncIO 的主要思想是,即使使用单个线程,您也可以让 CPU 不断执行计算,而不是等待网络 IO。
如果你想更多地了解asyncIO,你需要了解并发和并行的区别。这是一个很好的Go talk about this subject,但原理是一样的。
因此,即使 python 有 GIL,使用 asyncIO 的性能也会比使用传统线程好得多。 Here are some benchmarks: