线程-进程-协程

Python中因为有GIL(全局解释器锁)的存在,例如,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作“通行证”,并且在一个Python进程中,GIL只有一个。拿不到通行证的线程就不允许进入CPU执行。每次释放GIL锁,线程之间都会进行锁竞争,而切换线程会消耗资源。由于GIL锁的存在,Python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是在多核CPU上Python的多线程效率不高的原因。

Python的多线程对于IO密集型代码比较友好,网络爬虫能够在获取网页的过程中使用多线程,从而加快速度。

优点 缺点 适用场景
多线程 Python的多线程对于IO密集型代码比较友好 多核CPU上Python的多线程效率不高 IO密集
多进程 提升对多核性能的利用 太消耗资源
协程 1.协程像一种在程序级别模拟系统级别的进程,由于是单线程,并且少了上下文切换,因此相对来说系统消耗很少,而且网上的各种测试也表明协程确实拥有惊人的速度。 2.协程方便切换控制流,这就简化了编程模型。协程能保留上一次调用时的状态(所有局部状态的一个特定组合),每次过程重入时,就相当于进入了上一次调用的状态。 3.协程的高扩展性和高并发性,一个CPU支持上万协程都不是问题,所以很适合用于高并发处理。 1.协程的本质是一个单线程,不能同时使用单个CPU的多核,需要和进程配合才能运行在多CPU上。 2.有长时间阻塞的IO操作时不要用协程,因为可能会阻塞整个程序。

爬虫

0.单线程

1.基于_thread的多线程

2.基于threading的多线程

3.基于threading+Queue的多线程

4.基于Process + Queue的multiprocess多进程

5.基于Pool +Queue的multiprocess多进程

6.基于gevent的多协程

7.基于aiohttp的多协程

8.grequests

Requests + Gevent = ❤️ https://pypi.python.org/pypi/grequests

9.多线程+协程组合