该节我们来讲讲爬虫中的一个难点,并发.并发是什么,并发即同时启动多个进程/线程来运行所给予的任务.那进程/线程又有都是什么呢?我们来简单的介绍一下.
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
而线程,有时被称为轻量级进程(Lightweight Process,LWP).线程是进程中的一个实体,可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
我们一般讲的爬虫并发,是指在同一个时间内,有N个爬虫同时执行者不同的链接这种情况.那么现在来看看有些语言对于并发的支持性如何.在此我拿我写过的几种语言的爬虫举个例子.
- python由于GIL(Global Interpreter Lock:全局解释锁)机制的存在,导致在多线程上效率极低.因为GIL机制其作用简单说就是:对于一个解释器,只能有一个线程在执行bytecode.所以,我们一般用multiprocessing来实现多进程.
- javascript,由于与golang一样被开发时就被当作要处理高并发的需求,所以他们自身的并发都是原生支持的,我用起来很喜欢.比如javascript的eventproxy模块用来控制并发并且将串行等待变成并行等待,提升多异步协作场景下的执行效率.
- golang的sync则可以使用协程方式来进行并发。线程并发时多个线程相对独立,有自己的上下文,切换受系统控制;而协程并发时协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
很明显,语言特性决定了该语言的并发性能.你现在去翻翻你语言的文档,看看你语言对并发的支持力度有多少呢?