1、并发和并行
并发是指在一个时间段内发生若干事件的情况;
并行是指在同一时刻发生若干事件的情况。
在使用单核CPU时,多个工作任务时以并发的方式运行的;在使用多核CPU时,在各个核的任务能够同时运行,是并行。
2、同步和异步
同步是并发或并行的各个任务不是独自完成,任务之间有一定的交替顺序,可能要在一个任务运行完得到结果后,才能开始运行另一个任务。
异步是并发或并行的各个任务可以独自完成,一个任务的运行不会受到另一个任务的影响。
同步IO(Input/Output)指每单击一个网页,要等这个网页彻底显示出来后才能单击另一个网页;异步IO指单击完一个网页后,不需要等对方服务器返回结果,就可以用新打开的浏览器窗口打开另一个网页。
3、多线程
进程是执行中的一段程序,而一个进程中执行中的每个任务即为一个线程。
一个线程只可以属于一个进程,但一个进程能包含多个线程。
多线程爬虫以并发的方式异步执行,即多个线程并不是真正的同时执行任务,而是通过进程的快速切换加快网络的爬虫速度。python的多线程爬虫只能运行在单核上。
在python中,一个线程的执行过程需要获取GIL(全局解释器锁)、执行代码直到挂起和释放GIL。因此python中一个进程只能同时执行一个线程,这也是在多核CPU上python的多线程效率不高的原因。
使用多线程的两种方法:
(1)函数式:调用thread模块中的start_new_thread()函数产生新线程;
(2)类包装式:调用Threading库创建线程,从threading.Thread继承。
4、多进程
多进程爬虫利用CPU的多核,进程数取决于计算机CPU的处理器个数。各个进程并行运行在不同的核上。
python进行多进程要使用multiprocessing库,使用该库有两种方法:
(1)Process + Queue
(2) Pool + Queue
5、多协程
协程是一种用户态的轻量级线程,在程序级别来模拟系统级别用的进程。在一个基础进程中,一个线程通过程序的模拟方法实现高并发。多协程可理解为一个人其实同时只能做一件事,但是可以把几个任务拆成几部分来交叉执行。在python中可以使用gevent库实现多协程。