• TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(而UDP 发送的报文长度是应用进程给出的)
  • TCP 可把太长的数据块划分短一些再传送,TCP 也可等待积累有足够多的字节后再构成报文段发送出去

停止等待协议

这个协议最简单,所谓的停止等待就是说每发完一个分组就停止发送,等待对方的确认,在收到确认之后才发送下一个分组.

超时重传:

  • A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。
    要实现超时重传,就要在每发送完一个分组时设置一个超时计时器。
  • 若B所发送的对M1的确认丢失了,A在超时计时器到期后就要重传M1。此时B第二次收到了M1,应采取两个动作:
    (1)丢弃这个重复的分组M1,不向上层交付。
    (2)向A发送确认

1554714363080

流水线传输

asdasd

使用流水线传输需要使用连续ARQ协议滑动窗口协议

1554715337142

  • 一口气先将1,2,3,4,5共5个分组发出去.然后停止等待.收到一个确认后发送窗口就向前滑动一格.上图中,数据包6被滑进格子里,此时数据包6就可以被发送,同时数据包1也可以从缓存中清除,
  • 接收方一般采用累积确认的方式。

TCP的流量控制

接收方的窗口值决定发送方的滑动窗口,所以我们就可以通过滑动窗口来控制流量

TCP的拥塞控制

TCP猜测发生拥塞的方法很简单:如果迟迟不能收到对方主机的确认信息,就判断发生了拥塞.

注意拥塞控制和流量控制不是同一种东西:
流量控制是指点对点的通信量控制
拥塞控制是全局性的,就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

简单来讲:流量控制指的是怕接收端来不及存缓而让发送端放慢速度.拥塞控制让整个网络不至于过载.

  • 发送方维持一个叫做**拥塞窗口 cwnd (congestion window)**的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
  • 发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。

三次握手

(注:SYN为同步,seq为序列号,ack为确认号)

8992321-08b9544000f3a26e

TCP建立连接的三次握手

  • 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND态,待服务器确认

    SYN:同步序列编号(Synchronize Sequence Numbers)

  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,服务器进入SYN_RECV

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

四次挥手

1554732261416

  1. 客户端A发送一个FIN,用来关闭Client A —->>>Server B的数据传送
  2. B收FIN,发ACK,确认序号为收到的序号加1
  3. B关闭与A的连接,发FIN给A
  4. A发ACK报文确认,并将确认序号设置为收到序号加1

HTTP各个方法及其作用

  1. GET:获取资源
  2. POST:传输实体主体
  3. PUT:传输文件
  4. HEAD:获得报文首部
    (用于确认URI 的有效性及资源更新的日期时间等)
  5. DELETE:删除文件
  6. OPTIONS:询问某个 URI 支持的方法
  7. TRACE:追踪路径
    (让 Web 服务器端将之前的请求通信环回给客户端的方法)
  8. CONNECT:要求用隧道协议连接代理

其中DELETE,PUT方法自身不带验证机制,一般网站不使用

三次握手

客户端发送:SYN

服务器发送:SYN/ACK

客户端发送:ACK

发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。

  • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
  • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
  • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。

四次挥手

  • 由于TCP是全双工的,因此在每一个方向都必须单独关闭。
  • 先关读,再关写
  • 以客户机发起关闭连接为例:
    1. 服务器读通道关闭;
    2. 客户端写通道关闭;
    3. 客户端读通道关闭;
    4. 服务器写通道关闭。

服务器发送FIN

客户端发送ACK

客户端发送FIN

服务器发送ACK

  • 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
  • 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
  • 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
  • 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
  1. Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  2. Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  3. Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  4. Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

状态码的分类

1561534263855

各层的作用

  1. 应用层决定了向用户提供应用服务时通信的活动。
  2. 传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据
    传输。
  3. 网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数
    据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计
    算机,并把数据包传送给对方。
  4. 链路层用来处理连接网络的硬件部分。

URI和URL的关系

URI 用字符串标识某一互联网资源,而 URL 表示资源的地点(互联网上所处的位置)。可见 URL是 URI 的子集。

请求报文的构成

  1. 请求方法
  2. 请求 URI
  3. 协议版本
  4. 请求首部字段(可选)
  5. 内容实体

1561537514012

响应报文的构成

  1. 协议版本
  2. 状态码
  3. 原因短语:(用以解释状态码)
  4. 响应首部字段(可选)
  5. 实体主体

1561537681168

从输入URL到页面加载完成发生了什么

url解析 - DNS解析 - TCP连接 - 服务器处理静态文件,转发动态请求 - 框架处理 - 数据查询 - 模板渲染 - 前端解析

同源策略

同源策略需要同时满足以下三点要求:

  1. 协议相同
  2. 域名相同
  3. 端口相同

cookie和session的区别

  • session 的运行依赖 session id,而 session id 是存在 cookie 中的

    Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie

  • 存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置

  • session 在服务器端,cookie 在客户端(浏览器)

什么是XSS

XSS(cross-site scripting跨域脚本攻击)

攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

怎么实现强行关闭客户端和服务器之间的连接

  • TCP socket连接的关闭过程有两种,
    1. 一种是优雅关闭(graceful close),一种是强制关闭(hard close或abortive close)。
    2. 所谓优雅关闭是指,如果发送缓存中还有数据未发出则其发出去,并且收到所有数据的ACK之后,发送FIN包,开始关闭过程。
    3. 而强制关闭是指如果缓存中还有数据,则这些数据都将被丢弃,然后发送RST包,直接重置TCP连接。

UDP和TCP

UDP的特性

  1. UDP是无连接的(不需要先TCP一样先建立连接)
  2. UDP是不可靠的
  3. UDP是面向报文的.

TCP的特点

  • 面向连接
  • 每一条 TCP 连接只能有两个端点(endpoint)
  • 提供可靠交付的服务
    (无差错,不丢失,不重复,按序到达)
  • 提供全双工通信
  • 面向字节流
    字节流指的是:流入到进程或者从进程流出的字节序列.

简述 TCP 和 UDP 的区别以及优缺点

  • UDP: 面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。
    1. 优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
    2. 缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,也不重复发送,不可靠。丢包、乱序、数据不完整
  • TCP:面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
    1. 优点:TCP 在数据传递时,有确认窗口重传阻塞等控制机制,能保证数据正确性,较为可靠。
    2. 缺点:TCP 相对于 UDP 速度慢一点,效率低,要求系统资源较多,易被攻击。

简述 OSI 七层协议

  1. 物理层(Physical Layer):建立、维护、断开物理连接。
  2. 数据链路层 (Link):逻辑连接、进行硬件地址寻址、差错校验等。
  3. 网络层 (Network):进行逻辑寻址,实现不同网络之间的路径选择。
  4. 传输层 (Transport):定义传输数据的协议端口号,及流控和差错校验。
  5. 会话层(Session Layer):建立、管理、终止会话。
  6. 表示层(Presentation Layer):数据的表示、安全、压缩。
  7. 应用层 (Application):网络服务与最终用户的一个接口

通俗来说,

  • 物理层到电缆连接,
  • 数据链路层到网卡,
  • 网络层路由到主机,
  • 传输层到端口,
  • 会话层维持会话,
  • 表示层表达数据格式,
  • 应用层就是具体FTP/HTTP等协议了

什么是C/S和B/S架构?

  • B/S基于浏览器,像网站,C/S就像QQ,就不要网址。
  • B/S的就是实用,只要你能上网就能用,C/S要安裝,维护也很麻烦。
  • B/S缺点就安全性不好,容易被攻击。C/S维护难,普及度不高。

img

优缺点

  • C/S的最大优点是能够实现复杂的应用构造,安全性高,数据传输速度快。
  • B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的电脑就能使用,客户端零安装、零维护。系统的扩展非常容易。

什么是ARP协议?

ARP协议的本质是完成网络地址到物理地址的映射。根据机器的IP地址解析出相应的硬件地址

  • 主机ARP高速存缓(ARP cache)中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新.
  • 当ARP高速存缓中,没有找到目标IP的硬件地址,这时就会广播求助.
    目标主机接收这个信息后会单播给提问主机.

什么是局域网和广域网?

  • 广域网是一种跨越大的、地域性的计算机网络的集合。就是我们通常说的Internet,通常跨越省、市,甚至一个国家,乃至遍及全世界。广域网包括大大小小不同的子网,子网可以是局域网,也可以是小型的广域网。
  • 局域网主要是指在某一区域的计算机互联网络。“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,一般是方圆几千米以内。

为何基于tcp协议的通信比基于udp协议的通信更可靠?

  • 确认和重传机制
  • 数据排序
  • 流量控制
  • 拥塞控制

什么是socket?简述基于tcp协议的套接字通信流程。

  • socket是支持TCP/IP协议的网络通信的基本操作单元。
  • 它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:
    1. 连接使用的协议,
    2. 本地主机的IP地址,
    3. 本地进程的协议端口,
    4. 远地主机的IP地址,
    5. 远地进程的协议端口。
  • 一个Socket是一对IP地址和端口。
  1. 服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听。
  2. 用 bind 函数来绑定一个端口号和 IP 地址。因为本地计算机可能有多个网址和 IP,每一个 IP 和端口有多个端口。需要指定一个 IP 和端口进行监听。
  3. 服务器调用 listen 函数,使服务器的这个端口和 IP 处于监听状态,等待客户机的连接。
  4. 客户机用 socket 函数建立一个套接字,设定远程 IP 和端口。
  5. 客户机调用 connect 函数连接远程计算机指定的端口。
  6. 服务器用 accept 函数来接受远程计算机的连接,建立起与客户机之间的通信。
  7. 建立连接以后,客户机用 write 函数向 socket 中写入数据。也可以用 read 函数读取服务器发送来的数据。
  8. 服务器用 read 函数读取客户机发送来的数据,也可以用 write 函数来发送数据。
  9. 完成通信以后,用 close 函数关闭 socket 连接。

1561592999947

什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

  • TCP并没有数据包是完全流式的,他会开辟一个缓冲区,发送端往其中写入数据,每过一段时间就发送出去,然后接收端接收到这些数据
  • 但是并不是说我发送了一次数据就肯定发送出去了,数据会在缓冲区中,有可能后续发送的数据和之前发送的数据同时存在缓冲区中随后一起发送,这就是粘包的一种形式
  • 接收端也有产生粘包的情况,如果应用程序没有及时处理缓冲区中的数据,那么后续到达的数据会继续存放到缓冲区中,也就是2次接收的数据同时存在缓冲区中 下次取缓冲区的时候就会取出2次粘包后的数据 这是粘包的另外一种形式
  • 还有其他许多形式 比如填充缓冲区到一半缓冲区满了直接发送了 但是其实那个包还没填充完全 这个就是不完整的粘包了 剩余数据会在下次发送的时候补上

解决方法 :

  • 如果你是连续的整个数据流 比如发送文件 那么完全不考虑粘包也无所谓 因为可以建立连接后发送 发送完毕后断开连接 整个数据流就是整个一个文件 无论数据从那里切开都无所谓 整个拼接后依旧是整个一个文件的数据

  • 如果你发送的数据是多次通信 比如把一个目录下所有的文件名都发送过去 那么就不能当作一个整体发送了 必须对他们划分边界 有一个很简单的处理方法 就是采用数据长度+实际数据的格式来发送数据 这个数据长度的格式是固定宽度的 比如4字节 可以表示0~4GB的宽度了 足够用了 这个宽度说明了后续实际数据的宽度 这样你就可以把粘包后的数据按照正确的宽度取出来了

    接收端一定是先收到包头,解析包头中的文件大小字段后,继续接收文件大小规定的包数据,读不够继续等待,如果超长,说明读到了下一个文件或数据包的内容, 应该缓存起来,给下个包使用。等到读取到了指定大小的包后,数据就已经是完整的。

简单来说:

  • 发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小、数据量小的数据包,合并成一个大的数据包发送(把发送端的缓冲区填满一次性发送)。
  • 接收端底层会把tcp段整理排序交给缓冲区,这样接收端应用程序从缓冲区取数据就只能得到整体数据而不知道怎么拆分
  • 比如发送端发送了一个由2个100字节组成的200字节的数据包到接受端的缓冲区,接受端从缓冲去一次取80字节的数据,那么第一次取的就是一个不完整的数据包,第二次取就会带上第一个数据包的尾部和下一个数据包的头

聊聊同步、异步、阻塞与非阻塞

  • 同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态

  • 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。

  • 所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。

  • 同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者

IO多路复用的作用?

就是很多网络连接(多路),共(复)用少数几个(甚至是一个)线程
通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

什么是防火墙以及作用?

  • 防火墙是一个分离器、一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全
  • 作用:
    1. 防火墙是网络安全的屏障
    2. 可以强化网络安全策略
    3. 对网络存取和访问进行监控审计
    4. 防止内部信息的外泄
    5. 除了安全作用,防火墙还支持具有Internet服务特性的企业内部网络技术体系VPN(虚拟专用网)。

简述 进程、线程、协程的区别 以及应用场景?

  • 线程是指进程内的一个执行单元,
  • 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
  • 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度
  • 协程避免了无意义的调度,由此可以提高性能;但同时协程也失去了线程使用多CPU的能力

进程与线程的区别

  1. 地址空间:线程是进程内的一个执行单位,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间
  2. 资源拥有:进程是资源分配和拥有的单位,同一个进程内线程共享进程的资源
  3. 线程是处理器调度的基本单位,但进程不是
  4. 二者均可并发执行
  5. 每个独立的线程有一个程序运行的入口

协程与线程

  1. 一个线程可以有多个协程,一个进程也可以单独拥有多个协程,这样Python中则能使用多核CPU
  2. 线程进程都是同步机制,而协程是异步
  3. 协程能保留上一次调用时的状态

进程和线程之间的通讯方式:

  1. 互斥锁 : lock = threading.Lock()
  2. 独立的存储空间 : local = threading.local()
  3. 信号量 : sem = threading.Semaphore(3)
  4. 凑够一定数量的线程才能执行 : bar = threading.Barrier(4)
  5. 定时线程 : t = threading.Timer(5,run)
  6. 事件 : event = threading.Event()
  7. 条件 : cond = threading.Condition()

threading.local的作用?

实现线程局部变量的传递。

ThreadLocal 最常用的地方:
为每个线程绑定一个资源(数据库连接,HTTP请求,用户身份信息等),这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。

进程锁和线程锁的作用?

  • 线程锁:
    用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。但是,其余线程是可以访问该对象中的非加锁代码块的。
  • 进程锁:
    也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。
  • 分布式锁:
    当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。

什么是并发和并行?

  • 并发:同一时刻只能处理一个任务,但一个时段内可以对多个任务进行交替处理(一个处理器同时处理多个任务)
  • 并行:同一时刻可以处理多个任务(多个处理器或者是多核的处理器同时处理多个不同的任务)

路由器和交换机的区别

  1. 交换机:是负责内网里面的数据传递(arp协议)根据MAC地址寻址
    路由器:在网络层,路由器根据路由表,寻找ip的网段
  2. 路由器可以处理TCP/IP协议
  3. 路由器可以把一个IP分配给很多个主机使用,这些主机对外只表现出一个IP。
    交换机可以把很多主机连起来,这些主机对外各有各的IP。
  4. 交换机是用来做端口扩展的,也就是让局域网可以连进来更多的电脑。
    路由器是用来做网络连接的,也就是连接不同的网络

什么是域名解析?

在互联网上,所有的地址都是ip地址,现阶段主要是IPv4(比如:110.110.110.110)。
但是这些ip地址太难记了,所以就出现了域名(比如http://baidu.com)。
域名解析就是将域名,转换为ip地址的这样一种行为。

生产者消费者模型应用场景及优势?

  • 解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,而是利用阻塞队列来进行通讯,生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,
  • 解决生产者与消费者生产与消费的速率不一致的问题,达到平衡生产者与消费者的处理能力,而阻塞队列则相当于缓冲区。
  • 应用场景:用户提交订单,订单进入引擎的阻塞队列中,由专门的线程从阻塞队列中获取数据并处理

优势:

  • 解耦
  • 支持并发
  • 支持忙闲不均

什么是cdn?

  • cdn 即内容分发网络
  • 目的是使用户可以就近到服务器取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

什么是负载均衡?

负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。

什么是HAProxy?

  • HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。
  • HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。
  • 核心功能 :负载均衡,健康检查,会话保持,SSL,HTTP请求重写与重定向,监控与统计

LVS是什么及作用?

  • Linux Virtual Server,即Linux虚拟服务器。
  • LVS主要用于多服务器的负载均衡。
  • 它工作在网络层,可以实现高性能,高可用的服务器集群技术。
    1. 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
    2. 易用,配置非常简单,且有多种负载均衡的方法。
    3. 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
    4. 可扩展性也非常好。

keepalived是什么及作用?

  • Keepalived是一款优秀的实现高可用的软件,它运行于LVS之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换。
  • Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。

Nginx是什么及作用?

  • Nginx是一个轻量级、高性能、稳定性高、并发性好的HTTP和反向代理服务器。
    • 作为 Web 服务器
    • 作为负载均衡服务器
    • 作为邮件代理服务器
  • 反向代理服务器 :
    1. 在服务器端接受客户端的请求,然后把请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端。
    2. 用户访问会先访问到Nginx服务器,然后Nginx服务器再从服务器集群中选择压力较小的服务器,然后将该访问引向该服务器

什么是rpc及应用场景?

  • RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
  • 简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源

什么是协程

  • 协程是一种用户态的轻量级线程
  • 协程拥有自己的寄存器上下文.
    协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,
  • 因此协程能保留上一次调用时的状态(即所有局部状态的一个特定组合,),每次过程重入时,就相当于上一次调用的状态, 也就是进入上一次离开时所处逻辑流的位置

劣处:

  • 无法利用多核资源,协程的本质是个单线程,它不能同时将单个CPU的多个核用上, 协程需要配合进程才能在多CPU上, 适用于CPU密集型应用
  • 进程阻塞 (Blocking) 操作 如IO操作时,会阻塞掉整个程序

简述asynio模块的作用和应用场景

实现高并发的一个模块

  • event_loop 事件循环:程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数
  • coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
  • task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含了任务的各种状态
  • future: 代表将来执行或没有执行的任务的结果。它和task上没有本质上的区别
  • async/await 关键字:python3.5用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。

简述 gevent模块的作用和应用场景。

  • greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator(生成器)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from greenlet import greenlet

    def test1():
    print('test1:我是1')
    gr2.switch() #切换到test2
    print('test1:我是1.1')
    gr2.switch()

    def test2():
    print('test2:我是2')
    gr1.switch() #切换到test1
    print('test2:我是2.2')


    gr1=greenlet(test1)
    gr2=greenlet(test2)
    gr1.switch() #先切换到test1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import gevent

    def func1():
    print('\033[31;1m我是func1\033[0m')
    gevent.sleep(3)
    print('\033[31;1m我是func1.1--我上面有3秒\033[0m')

    def func2():
    print('\033[32;1m我是func2.\033[0m')
    gevent.sleep(2)
    print('\033[32;1m我是func2.1 我上面有2秒\033[0m')

    def func3():
    print('\033[32;1m我是func3.\033[0m')
    gevent.sleep(2)
    print('\033[32;1m我是func3.1我上面有2秒\033[0m')

    gevent.joinall([gevent.spawn(func1),
    gevent.spawn(func2),
    gevent.spawn(func3),])

    当一个 greenlet 遇到IO操作时,就自动切换到其他的 greenlet 等到IO操作完成,再在适当的时候切换回来继续执行,有了 gevent 为我们自动切换协程就保证总有 greenlet在运行而不是等待IO

twisted框架的使用和应用

  • Twisted是用Python实现的基于事件驱动的网络引擎框架。
  • Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。
  • Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。