2020-05-08 10:38发布
1、多进程
多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。缺陷:多个进程之间通信成本高,切换开销大。
2、多线程
多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。
GIL锁
Python一般默认是CPython版本,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行,在遇到IO阻塞时也会释放这把锁。这个GIL全局锁实际上把所有线程的执行代码都给上了锁。一个进程使用一个解释器,一个解释器一把锁。
3、协程
协程:又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。
多线程请求返回是无序的,那个线程有数据返回就处理那个线程,而协程返回的数据是有序的。
缺陷:单线程执行,处理密集CPU和本地磁盘IO的时候,性能较低。处理网络I/O性能还是比较高.
4、总结
(1)多进程和多线程的选择
因为爬虫属于IO型,在选择多进程还是多线程的时候,还是多线程更加合适爬虫。其实GIL锁和爬虫还是天生一对,爬虫网络IO阻塞的时候,GIL也会释放,这样避免了GIL对多线程造成的效率低的问题。
(2)多进程和多线程和协程的选择
在这三者之间,选择协程。虽然协程本地磁盘IO可能稍微较差,但是可以在网络IO部分用协程来处理,磁盘IO部分另寻他法(数据使用网络IO存储到数据库中)。
我的爬虫学习
Python爬虫多线程多进程多线程多进程
Python爬虫多线程多进程
多线程
自己的爬虫一直在用多进程,以前一直没了解过多线程,只知道多线程适合IO密集型场景,感觉自己的也不太需要,所以就一直用Multiprocessing,昨天经理让我们写多线程的爬虫,我就去学习了一下,了解到了Python有一个终极黑科技:GIL锁(globalinterpreterlock)
任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁
就是比如你想计算从0依次+1到一百万要多少时间,对比单线程和两线程,期望得到比单线程快一倍的速度,使用了之后发现不仅不快而且更慢了,因为GIL锁的存在,两(多)个线程同时只能运行一个,所以就是线程1运行了一会,然后线程2运行,且只能在一个核心上运行,怎么样,够不够黑科技,简直黑死了。。。
多进程
但是多进程就没有这方面的顾虑,一个进程使用一个解释器,一个解释器一把锁,所以多个线程就是多把不互相干预的锁,运行起来就能得到期望的速度,当然你有几个核心就最多在Pool里放进个进程,工作地方的电脑只有两个核心哈哈。
多线程和多进程都是可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。
进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。每个进程相对独立,可以更好地利用多核CPU的资源。进程之间的通信由操作系统传递,导致通讯效率低,切换开销大。
线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小,但是对CPU的利用率不如进程。
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程。
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程
多进程爬虫的优缺点
相对于多线程,多进程爬虫更重,更慢,但也可靠。
多进程爬虫可以认为是分布式爬虫的基础,在单机上也可以用。因为一般大型的网站的服务器都是采用分布式部署的,可以采用多进程同时在不同的服务器器上进行爬取。
爬虫采用多线程还是多进程好
进程与线程是明显不同的,因为PYTHON本身由于GIL的关系,也就是它本质一个PYTHON进程只可能有一个线程,不管说的是多少线程都是模拟出来的多线程,所以,你真要快速,这个要用多进程来处理。
在python环境下,多进程稍稍比多线程好实现好理解一点。
因为爬虫大多数都是运行在linux内核的服务器上面,而在linux操作系统下,多进程要比多线程更加合适,因为调度开销和多线程差不多,但是进程性能更好。
如果在windows系统下跑爬虫的话,建议使用框架或者使用多线程。
爬虫毕竟不是服务器交互,没有人会开1k的线程去跑这个,所以一般情况下我们把自己爬虫的效率提升几倍即可。
从计算机硬件角度:
计算机的核心是CPU,承担了所有的计算任务。一个CPU,在一个时间切片里只能运行一个程序。
从操作系统的角度:
进程和线程,都是一种CPU的执行单元。
进程:表示一个程序的上下文执行活动(打开、执行、保存...)
线程:进程执行程序时候的最小调度单位(执行a,执行b...)
一个程序至少有一个进程,一个进程至少有一个线程。
多进程/多线程:表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。
进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。
线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小。
共享意味着竞争,导致数据不安全,为了保护内存空间的数据安全,引入"互斥锁"。
一个线程在访问内存空间的时候,其他线程不允许访问,必须等待之前的线程访问结束,才能使用这个内存空间。
互斥锁:一种安全有序的让多个线程访问内存空间的机制。
Python的多线程:
GIL 全局解释器锁:线程的执行权限,在Python的进程里只有一个GIL。
一个线程需要执行任务,必须获取GIL。
好处:直接杜绝了多个线程访问内存空间的安全问题。坏处:Python的多线程不是真正多线程,不能充分利用多核CPU的资源。
但是,在I/O阻塞的时候,解释器会释放GIL。
所以:
多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。 multiprocessing缺陷:多个进程之间通信成本高,切换开销大。
多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。threading.Thread、multiprocessing.dummy缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。
在python中列表(list)是使用最频繁的数据类型,在其他语言中通常叫做数组。列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。...
简单来讲,爬虫就是一个探测机器,它的基本操作就是模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。...
因为Python可以做数据分析 数据挖掘,数据挖掘的话简单来说就是爬虫工程师
1)学习爬虫,可以私人订制一个搜索引擎,并且可以对搜索引擎的数据采集工作原理进行更深层次地理解。有的朋友希望能够深层次地了解搜索引擎的爬虫工作原理,或者希望自己能够开发出一款私人搜索引擎,那么此时,学习爬虫是非常有必要的。简单来说,我们学会了...
大部分数据都是可以爬的,不过有些网站对数据的加密做的非常好,在解析的过程中要消耗很长的时间。
抓取数据,进行统计和分析
在成都找网络爬虫工作也是可以的,自己可以先到招聘软件上看看当地招聘的需求量以及薪资待遇水平怎么样,要是能达到自己的预期效果可以在当地工作,要不可以到北上广深找工作,就业机会能更多些。...
两种方式,一种是MySQL自带的命令行窗口,一种是图形用户管理工具,前者类似于一个cmd窗口,日常管理维护数据库不是很方便,后者就是一个图形用户管理软件,种类繁多,使用起来也相对容易一些...
不可以所有编程最起码都得学函数,分支,循环之后才可以编写代码
一台主机 多台从机
一、分布式爬虫架构在了解分布式爬虫架构之前,首先回顾一下Scrapy的架构,如下图所示。Scrapy单机爬虫中有一个本地爬取队列Queue,这个队列是利用deque模块实现的。如果新的Request生成就会放到队列里面,随后Request被Scheduler调度。之后,Request交给Down...
代理ip网址http://www.goubanjia.com/http://www.ip181.com/https://www.kuaidaili.com/python 环境安装requests库安装bs4库proxies设置代理服务器地址proxies = {'http': 'http://61.155.164.110:3128'}http://www.goub......
import requestsimport jsonfrom bs4 import BeautifulSoupfrom urllib.request import urlretrieve#构造函数def sk(): #请求头 header={ 'user-Agent':'Mozilla/5.0 (Windows NT 10.0; W...
针对字符串中本身含有双引号,我们可以利用单引号进行字符串的定义来解决这个问题。使用单引号作为字符串的界限就不会引起识别异常问题,保证字符串的合理定义
要用unicode编码来替换。
最多设置5个标签!
1、多进程
多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。
缺陷:多个进程之间通信成本高,切换开销大。
2、多线程
多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。
GIL锁
Python一般默认是CPython版本,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行,在遇到IO阻塞时也会释放这把锁。这个GIL全局锁实际上把所有线程的执行代码都给上了锁。一个进程使用一个解释器,一个解释器一把锁。
3、协程
协程:又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。
多线程请求返回是无序的,那个线程有数据返回就处理那个线程,而协程返回的数据是有序的。
缺陷:单线程执行,处理密集CPU和本地磁盘IO的时候,性能较低。处理网络I/O性能还是比较高.
4、总结
(1)多进程和多线程的选择
因为爬虫属于IO型,在选择多进程还是多线程的时候,还是多线程更加合适爬虫。其实GIL锁和爬虫还是天生一对,爬虫网络IO阻塞的时候,GIL也会释放,这样避免了GIL对多线程造成的效率低的问题。
(2)多进程和多线程和协程的选择
在这三者之间,选择协程。虽然协程本地磁盘IO可能稍微较差,但是可以在网络IO部分用协程来处理,磁盘IO部分另寻他法(数据使用网络IO存储到数据库中)。
我的爬虫学习
Python爬虫多线程多进程多线程多进程
Python爬虫多线程多进程
多线程
自己的爬虫一直在用多进程,以前一直没了解过多线程,只知道多线程适合IO密集型场景,感觉自己的也不太需要,所以就一直用Multiprocessing,昨天经理让我们写多线程的爬虫,我就去学习了一下,了解到了Python有一个终极黑科技:GIL锁(globalinterpreterlock)
任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁
就是比如你想计算从0依次+1到一百万要多少时间,对比单线程和两线程,期望得到比单线程快一倍的速度,使用了之后发现不仅不快而且更慢了,因为GIL锁的存在,两(多)个线程同时只能运行一个,所以就是线程1运行了一会,然后线程2运行,且只能在一个核心上运行,怎么样,够不够黑科技,简直黑死了。。。
多进程
但是多进程就没有这方面的顾虑,一个进程使用一个解释器,一个解释器一把锁,所以多个线程就是多把不互相干预的锁,运行起来就能得到期望的速度,当然你有几个核心就最多在Pool里放进个进程,工作地方的电脑只有两个核心哈哈。
多线程和多进程都是可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。
进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。每个进程相对独立,可以更好地利用多核CPU的资源。进程之间的通信由操作系统传递,导致通讯效率低,切换开销大。
线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小,但是对CPU的利用率不如进程。
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程。
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程
多进程爬虫的优缺点
相对于多线程,多进程爬虫更重,更慢,但也可靠。
多进程爬虫可以认为是分布式爬虫的基础,在单机上也可以用。因为一般大型的网站的服务器都是采用分布式部署的,可以采用多进程同时在不同的服务器器上进行爬取。
爬虫采用多线程还是多进程好
进程与线程是明显不同的,因为PYTHON本身由于GIL的关系,也就是它本质一个PYTHON进程只可能有一个线程,不管说的是多少线程都是模拟出来的多线程,所以,你真要快速,这个要用多进程来处理。
在python环境下,多进程稍稍比多线程好实现好理解一点。
因为爬虫大多数都是运行在linux内核的服务器上面,而在linux操作系统下,多进程要比多线程更加合适,因为调度开销和多线程差不多,但是进程性能更好。
如果在windows系统下跑爬虫的话,建议使用框架或者使用多线程。
爬虫毕竟不是服务器交互,没有人会开1k的线程去跑这个,所以一般情况下我们把自己爬虫的效率提升几倍即可。
从计算机硬件角度:
计算机的核心是CPU,承担了所有的计算任务。
一个CPU,在一个时间切片里只能运行一个程序。
从操作系统的角度:
进程和线程,都是一种CPU的执行单元。
进程:表示一个程序的上下文执行活动(打开、执行、保存...)
线程:进程执行程序时候的最小调度单位(执行a,执行b...)
一个程序至少有一个进程,一个进程至少有一个线程。
多进程/多线程:
表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。
进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。
进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。
线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小。
共享意味着竞争,导致数据不安全,为了保护内存空间的数据安全,引入"互斥锁"。
一个线程在访问内存空间的时候,其他线程不允许访问,必须等待之前的线程访问结束,才能使用这个内存空间。
互斥锁:一种安全有序的让多个线程访问内存空间的机制。
Python的多线程:
GIL 全局解释器锁:线程的执行权限,在Python的进程里只有一个GIL。
一个线程需要执行任务,必须获取GIL。
好处:直接杜绝了多个线程访问内存空间的安全问题。
坏处:Python的多线程不是真正多线程,不能充分利用多核CPU的资源。
但是,在I/O阻塞的时候,解释器会释放GIL。
所以:
多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。 multiprocessing
缺陷:多个进程之间通信成本高,切换开销大。
多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
threading.Thread、multiprocessing.dummy
缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。
相关问题推荐
在python中列表(list)是使用最频繁的数据类型,在其他语言中通常叫做数组。列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。...
简单来讲,爬虫就是一个探测机器,它的基本操作就是模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。...
因为Python可以做数据分析 数据挖掘,数据挖掘的话简单来说就是爬虫工程师
1)学习爬虫,可以私人订制一个搜索引擎,并且可以对搜索引擎的数据采集工作原理进行更深层次地理解。有的朋友希望能够深层次地了解搜索引擎的爬虫工作原理,或者希望自己能够开发出一款私人搜索引擎,那么此时,学习爬虫是非常有必要的。简单来说,我们学会了...
大部分数据都是可以爬的,不过有些网站对数据的加密做的非常好,在解析的过程中要消耗很长的时间。
抓取数据,进行统计和分析
在成都找网络爬虫工作也是可以的,自己可以先到招聘软件上看看当地招聘的需求量以及薪资待遇水平怎么样,要是能达到自己的预期效果可以在当地工作,要不可以到北上广深找工作,就业机会能更多些。...
两种方式,一种是MySQL自带的命令行窗口,一种是图形用户管理工具,前者类似于一个cmd窗口,日常管理维护数据库不是很方便,后者就是一个图形用户管理软件,种类繁多,使用起来也相对容易一些...
不可以所有编程最起码都得学函数,分支,循环之后才可以编写代码
一台主机 多台从机
一、分布式爬虫架构在了解分布式爬虫架构之前,首先回顾一下Scrapy的架构,如下图所示。Scrapy单机爬虫中有一个本地爬取队列Queue,这个队列是利用deque模块实现的。如果新的Request生成就会放到队列里面,随后Request被Scheduler调度。之后,Request交给Down...
代理ip网址http://www.goubanjia.com/http://www.ip181.com/https://www.kuaidaili.com/python 环境安装requests库安装bs4库proxies设置代理服务器地址proxies = {'http': 'http://61.155.164.110:3128'}http://www.goub......
import requestsimport jsonfrom bs4 import BeautifulSoupfrom urllib.request import urlretrieve#构造函数def sk(): #请求头 header={ 'user-Agent':'Mozilla/5.0 (Windows NT 10.0; W...
针对字符串中本身含有双引号,我们可以利用单引号进行字符串的定义来解决这个问题。使用单引号作为字符串的界限就不会引起识别异常问题,保证字符串的合理定义
要用unicode编码来替换。