12

什么是CPU密集型、IO密集型?

CPU密集型(CPU-bound)

CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。

在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU bound的程序。 Continue reading

12

多进程和多线程的应用场景

多进程模型的优势是CPU,适用于CPU密集型。同时,多进程模型也适用于多机分布式场景中,易于多机扩展。

多线程模型主要优势为线程间切换代价较小,因此适用于I/O密集型的工作场景,因此I/O密集型的工作场景经常会由于I/O阻塞导致频繁的切换线程。同时,多线程模型也适用于单机多核分布式场景。

io 操作不占用CPU(从硬盘、从网络、从内存读数据都算io)
计算占用CPU(如1+1计算) Continue reading

08

并发、并行、同步、异步、多线程之间的关系和区别

并发:同一时间段有几个程序都处于已经启动到运行完毕之间,并且这几个程序都在同一个处理机上运行,并发的两种关系是同步和互斥;

互斥:进程之间访问临界资源时相互排斥的现象;

同步:进程之间存在依赖关系,一个进程结束的输出作为另一个进程的输入。具有同步关系的一组并发进程之间发送的信息称为消息或者事件;

并行:单处理器中进程被交替执行,表现出一种并发的外部特征;在多处理器中,进程可以交替执行,还能重叠执行,实现并行处理,并行就是同事发生的多个并发事件,具有并发的含义,但并发不一定是并行,也就是说事件之间不一定要同一时刻发生;

多线程:多线程是进程中并发运行的一段代码,能够实现线程之间的切换执行;

异步:和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。线程是实现异步的一个方式,异步是让调用方法的主线程不需要同步等待另一个线程的完成,从而让主线程干其他事情。

异步和多线程:不是同等关系,异步是目的,多线程只是实现异步的一个手段,实现异步可以采用多线程技术或者交给其他进程来处理。

05

网站选购服务器如何计算理论带宽,服务器带宽的计算公式

网站选购服务器如何计算理论带宽,服务器带宽的计算公式,计算带宽,带宽计算

带宽指单位时间能通过链路的数据量,通常以bps来表示,即每秒可传输之位数。或以 bit/s(比特/秒)表示,而电信,联通,移动等运营商在推广的时候往往忽略了这个单位。

而且,带宽还分为上行带宽(上行速率)和下行带宽(下行速率)。对于服务器,上行带宽是指发送给其它终端的数据传输速率(即:出),下行带宽是指接收其它终端发来的数据传输速率(即:入)。

对服务器而言, 客户端下载资源消耗的是服务器的上行流量,客户端上传资源消耗的是服务器的下行流量。通常买的服务器,比如阿里云,一般买的带宽指的是上行带宽,下行通常是不限的。而且流量的计算一般都是以上行的来计算的。

所以,客户端上传资源,对服务器的带宽基本没有影响,因为服务器的下行基本不限的,跟客户端本身网络的带宽有影响;

而客户端下载资源,除了跟服务器的带宽有影响,跟客户端本身的网络带宽也有影响的。

我们常说的1兆的宽带,就是1Mbit/s(或1Mbps),也可以写成1024bit/s(或1024bps) Continue reading

十一 17

HTTP、TCP/IP、UDP、Socket、Socket长连接、Socket连接池

前言

​ 作为一名开发人员我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Socket连接池等字眼,然而它们之间的关系、区别及原理并不是所有人都能理解清楚,这篇文章就从网络协议基础开始到Socket连接池,一步一步解释他们之间的关系。

七层网络模型

​ 首先从网络通信的分层模型讲起:七层模型,亦称OSI(Open System Interconnection)模型。自下往上分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。所有有关通信的都离不开它,下面这张图片介绍了各层所对应的一些协议和硬件

119190082-5aba3da90a5aa

通过上图,我知道IP协议对应于网络层,TCP、UDP协议对应于传输层,而HTTP协议对应于应用层,OSI并没有Socket,那什么是Socket,后面我们将结合代码具体详细介绍。 Continue reading

十一 10

从Github上淘来的爬虫框架

Python

python自然不用多说,拥有的爬虫框架数不胜数。

  • scrapy,大名鼎鼎的爬虫框架,功能强大,乃入门学习的必备良药。支持多种多样的配置特性,唯一可惜不支持分布式的特性,于是就诞生了scrapy-redis这个以redis为队列的分布式爬虫框架。
  • pyspider,应该是个华人写的爬虫框架,可支持的配置非常多,同时也支持分布式,只需要配置中间的消息队列就可以。
  • portia,可视化的爬虫框架,对于编程经验少的人来说相当适合学习。
  • xcrawler,轻量级的爬虫框架。个人很简易从读轻量级的爬虫框架的源代码入手,这样能够由浅入深,学地更有意思。
  • cola,也是很强大的分布式爬虫框架,只是可惜不支持python 3以上。
  • fetchman, 国人写的爬虫框架,采用grequests来并发请求。看过源代码,写的容易理解,所以对于新手来说很实用。
  • gain, 使用asyncio`来异步爬取的轻量级爬虫框架。代码很容易理解,利于学习。

Java

Java接触的不是很多,所以知道的爬虫框架不多。

  • webmagic,这个是国人写的爬虫框架,很好用,也很强大。源代码的阅读体验也不错,推荐写java的可以去熟悉熟悉。
  • crawler4j, 比较好的爬虫架构,对于学习和理解爬虫框架很有用。
  • SeimiCrawler, 分布式爬虫框架,也是受到scrapy启发。支持动态渲染的页面爬虫。
  • elves, 轻量级的爬虫框架,国人写的。易于学习和理解。

Node

node接触的更加不多,但是也淘到了不错的几个框架。

  • node-crawler,强大且流行。采用Cheerio这个包解析网页结构。
  • webster,高性能的NodeJs爬虫框架,可爬取动态渲染的内容(通过headless Chrome)。

C#

C#作为笔者除了Python以外比较熟悉的语言了。但是发现其爬虫框架少的可怜。哎,不禁叹息。

  • DotnetSpider,整体架构参照了WebMagicScrapy,是C#中比较强大的存在。目前已经支持.net core 2.0,所以,喜欢C#的可以去玩玩。还是比较不错的支持Entity Framework
  • WebCrawler,国人写的轻量级的爬虫框架。可以去学习学习~~~

Continue reading

十一 09

什么是connect代理?

什么是connect代理?

对于HTTP代理,不少人有认识上的误区,有必要说明一下,不是所有的HTTP代理都只能代理HTTP的,vice versa!

HTTP CONNECT代理服务器是一种能够允许用户建立TCP连接到任何端口的代理服务器,这意味着这种代理不仅可用于HTTP,还包括FTP、IRC、RM流服务等,甚至扫描、攻击。

十一 09

什么是高匿名、匿名和透明代理?它们有什么区别?

什么是高匿名、匿名和透明代理?它们有什么区别?

HTTP代理按匿名度可分为透明代理、匿名代理和高度匿名代理。

透明代理

使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。

透明代理访问对方服务器所带的HTTP头信息如下:
REMOTE_ADDR = 代理服务器IP
HTTP_VIA = 代理服务器IP
HTTP_X_FORWARDED_FOR = 你的真实IP
透明代理还是将你的真实IP发送给了对方服务器,因此无法达到隐藏身份的目的。

匿名代理

使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP。

匿名代理访问对方服务器所带的HTTP头信息如下:
REMOTE_ADDR = 代理服务器IP
HTTP_VIA = 代理服务器IP
HTTP_X_FORWARDED_FOR = 代理服务器IP
匿名代理隐藏了你的真实IP,但是向访问对象透露了你是使用代理服务器访问他们的。

高匿名代理

使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP。

高匿名代理访问对方服务器所带的HTTP头信息如下:
REMOTE_ADDR = 代理服务器IP
HTTP_VIA 不显示
HTTP_X_FORWARDED_FOR 不显示
高匿名代理隐藏了你的真实IP,同时访问对象也不知道你使用了代理,因此隐蔽度最高。

11

正则表达式中的点星问号 .*? 或点星加号 .*+ 是什么意思

正则表达式中的点星问号 .*? 或点星加号 .*+ 是什么意思

后边多一个?表示懒惰模式。
必须跟在*或者+后边用
如:<img src="test.jpg" width="60px" height="80px"/>
如果用正则匹配src中内容非懒惰模式匹配
src=".*"
匹配结果是:src="test.jpg" width="60px" height="80px"
意思是从=”往后匹配,直到最后一个”匹配结束

懒惰模式正则:
src=".*?"
结果:src="test.jpg"
因为匹配到第一个”就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。

.表示除\n之外的任意字符
*表示匹配0-无穷
+表示匹配1-无穷

13

2019年1月 中国行政区划代码及名称(省市县区代码)

2019年1月 中国行政区划代码及名称(省市县区代码)

行政区划代码       单位名称
110000     北京市
110101     东城区
110102     西城区
110105     朝阳区
110106     丰台区
110107     石景山区
110108     海淀区
110109     门头沟区
110111     房山区
110112     通州区
110113     顺义区
110114     昌平区
110115     大兴区
110116     怀柔区
110117     平谷区
110118     密云区
110119     延庆区
120000     天津市
120101     和平区
120102     河东区
120103     河西区
120104     南开区
120105     河北区
120106     红桥区
120110     东丽区
120111     西青区
120112     津南区
120113     北辰区
120114     武清区
120115     宝坻区
120116     滨海新区
120117     宁河区
120118     静海区
120119     蓟州区
130000     河北省
130100     石家庄市
130102     长安区
130104     桥西区
130105     新华区
130107     井陉矿区
130108     裕华区
130109     藁城区
130110     鹿泉区
130111     栾城区
130121     井陉县
130123     正定县
130125     行唐县
130126     灵寿县
130127     高邑县
130128     深泽县
130129     赞皇县 Continue reading