前面跟你们讲的request s和spynner都是单进程(单线程)的顺序抓取,而并发和并行执行的异步抓取会极大地提升抓取效率。编程
并发和并行使两个类似的概念,并发是指在一个时间段内发生若干事件的状况,并行是指在同一时刻发生若干事件的状况。多线程
咱们能够以CPU的工做方式来讲明这两个概念并发
单核CPU下,多任务操做系统的各任务是以并发的方式运行的,由于只有一个处理器,因此各任务会以分时的方式在一段事件内分别占用CPU依次执行,若是在本身分得的时间段内没有完成,那么就须要等到下一次获得CPU的使用权时才会继续执行,直到整个任务完成,由于CPU的切换速度很快,因此给咱们的感受就是同时在运行多个任务异步
多核CPU下,由于有两个以上(包含两个)能够同时工做的内核,因此就有可能在各个核上运行的任务能同时进行,这就叫作并行编程语言
经过这张图你应该能更好的理解(串行不在咱们考虑的范围内)操作系统
同步和异步的概念,通常会涉及到多个任务或事件的参与。能够在并发或并行的背景下去理解这两个概念线程
同步指的是并发或并行发生的各任务之间不是孤立独自运行的,一个任务的进行可能须要在得到另外一个任务的给出的结果以后设计
或者说是只有一个任务完成或给出一个结果以后,另外一个任务在得到这个结果后才能继续运行blog
总之,各任务的运行会彼此相互制约,节奏和步调要协调好,不然就会出现错误进程
异步指的是并发或并行发生的各任务之间彼此是独立运行的,不受各自的影响,这是异步与同步最主要的区别
当须要多个任务互相配合在并发或并行环境中合做完成时,就须要以同步的方式运行
操做系统是以信号量机制来实现同步的,各种编程语言也在进行并行或并发程序设计时提供了同步机制
例如Python在多线程设计时的锁机制
当咱们须要将一个大的任务分解成若干个小的子任务时,各子任务能够分别独自完成,彼此之间不须要互相协做,这是就能够考虑使它们异步地并行或异步地并发执行
这在数据抓取时始终很常见的模式,将若干要抓取的连接分为几组,而后对每组分别使用子任务进行抓取,待各子任务抓取结束后,再将结果进行汇总,完成整个任务
关于这些概念大概就是这些,若是不是太明白,能够本身查阅资料弄明白