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

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论