面试题-Python网络编程与并发(34题)(待完善)

网络编程和并发(34题)

  1. 简述 OSI 七层协议。

    应表会传网数物(应用层,表示层,会话层,传输层,网络层,数据链路层,物理层)

    1、物理层
    为数据链路层提供物理连接,实现比特流的透明传输,所传输数据的单位是比特,该层定义了通信设备与传输线接口硬件的电气、机械以及功能和过程的特性。
    
    2、数据链路层
    在通信的实体之间建立数据链路连接,传送以帧为单位的数据,通过检查发生在连接通信系统间传送路上的比特错误并进行恢复,确保比特序列组成为数据流准确无误地传送给对方的系统。数据链路层在相邻的节点之间实现透明的高可靠性传输。
    
    3、网络层
    解决多节点传送时的路由选择、拥挤控制及网络互连等,控制分组传送系统的操作,它的特性对高层是透明的,同时,根据传输层的要求选择服务质量,并向传输层报告未恢复的差错。
    
    4、传输层
    为两个端系统(源站和目标站)的会话层之间建立一条传输连接,可靠、透明地传送报文,执行端一端差错控制、顺序和流量控制、管理多路复用等。本层提供建立、维护和拆除传送连接的功能,并保证网络连接的质量。它向高层屏蔽了下层数据通信的细节,因而是OSI网络参考模型中最需要的一层。
    
    5、会话层
    不参与具体的数据传输,但对数据传输的同步进行管理。它主要负责提供两个进程之间建立、维护和结束会话连接功能,同时要对进程中必要的信息传送方式、进程间的同步以及重新同步进行管理。
    
    6、表示层
    解决在两个通信系统中交换信息时不同数据格式的编码之间的转换,语法选择,数据加密与解密及文本压缩等。
    
    7、应用层
    负责向用户提供各种网络应用服务,如文件传输、电子邮件、远程访问等。把进程中于对方进程通信的部分放入应用实体中,同时,对各种业务内容的通信功能进行管理。
    
  2. 什么是C/S和B/S架构?

    C/S架构软件:
    (即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。
    
    B/S型模式:
    即浏览器/服务器结构。它是C/S架构的一种改进,可以说属于三层C/S架构。主要是利用了不断成熟的WWW浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。
    
  3. 简述 三次握手、四次挥手的流程。

    img

    三次握手**
    
    ​	**第一次握手**:客户端此时的状态为**SYN_SENT**,客户端向服务器发送序号为**seq=x的SYN =1**的请求,说我想连接到服务器
    
    ​	**第二次握手**:服务器收到后,此时的状态由原来的监听状态**LISTEN**变为**SYN_RCVD**,对客户端发送的请求作出回应,返回了**ACK=x+1**(在原序号基础上加1,表示是对这个序号的回应),同时发出了一个序号为**seq=y**的**SYN =1**请求,说‘你想连接我,可以啊,那么我可以连接你吗’;
    
    ​	**第三次握手**:客户端收到服务器的回应加请求后,此时的状态为**ESTABLISHED**,对服务器发送的请求作出回应,返回了**ACK=y+1**,说‘你也想连接我啊,可以啊,那么我们两个就连接起来了’,服务器收到客户端的同意后,状态为**ESTABLISHED**。此时,在客户端与服务端之间是有两条链接的,一条是服务端到客户端,还有客户端到服务端,就如两个城市之间的高速公路一样都是单项;
    
    在三次握手时  的确保证了数据传输是可靠  但是后续 有可能 由于种种原因 例如网络中断 ,,丢包等等 导致数据不完整
    
    所以 TCP的解决方案
    
    每次发送数据报  都需要对方返回一个确认信息,如果一段时间后 对方没有返回 就重复发送,直到重试的次数 超过某个指定的值  就判断连接已经丢失
    
    TCP的优点: 可以保证数据完整性
    
    由于需要接收确认信息  所以整体传输效率较低
    
    **四次挥手**
    
    客户端与服务器断开连接需要经历4次挥手
    
    ​	**第一次挥手**:客户端此时的状态为**FIN_WIAT_1**,客户端会先向服务器发送序号为**seq=x的FIN+ACK** 请求,说‘我现在不想和你连接了,我想断开’,此时客户端到服务器的数据是已经发送完了;
    
    ​	**第二次挥**手:服务器收到后,此时的状态为**CLOSE_WAIT**,对客户端的请求作出回应,返回了ACK=x+1,说‘我知道了’;客户端收到服务器的回应后,此时的状态为**FIN_WIAT_2**,没有任何操作。
    
    ​	**第三次挥手**:但此时的服务端可能还有数据没有发送完,所以不会与ACK同时发送,只有等到数据都发送完了,才会发送序号为**seq=y**的**FIN**请求,说‘那么我们就拜拜,再见了您’
    
    ​	**第四次挥手**:客户端收到服务器的请求后,此时的状态为**TIME_WIAT**,对服务器发送的请求作出回应,返回了**ACK=y+1**,说‘你也想和我断开啊,那么我们两个就分开吧’。此时就彻底断开连接了
    
  4. 什么是arp协议?

    地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
    
  5. TCP和UDP的区别?

    1.基于连接与无连接
    2.TCP要求系统资源较多,UDP较少;
    3.UDP程序结构较简单
    4.流模式(TCP)与数据报模式(UDP);
    5.TCP保证数据正确性,UDP可能丢包
    6.TCP保证数据顺序,UDP不保证
    
  6. 什么是局域网和广域网?

    局域网和广域网是按规模大小而划分的两种计算机网络。范围在几千米以内的计算机网络统称为局域网;而连接的范围超过10千米的,则称为广域网,因特网(Intenet)就是目前最大的广域网。
    
  7. 为何基于tcp协议的通信比基于udp协议的通信更可靠?

    TCP的可靠保证,是它的三次握手四次挥手双向机制,这一机制保证校验了数据,保证了他的可靠性。而UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。
    
  8. 什么是socket?简述基于tcp协议的套接字通信流程。

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
    
  9. 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

    粘包:
    指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
    
    socket 中造成粘包的原因:
    发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
    
    哪些情况会发生粘包现象:
    接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。分包是指在出现粘包的时候我们的接收方要进行分包处理。
    
    
  10. IO多路复用的作用?

    I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
    IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:
      (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I / O复用。
      (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
      (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I / O复用。
      (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I / O复用。
      (5)如果一个服务器要处理多个服务或多个协议,一般要使用I / O复用。
      与多进程和多线程技术相比,I / O多路复用技术的最大优势是系统开销小,系统不必创建进程 / 线程,也不必维护这些进程 / 线程,
    从而大大减小了系统的开销。
    
    
  11. 什么是防火墙以及作用?

    简单的来说,防火墙就是一种,避免你的电脑被黑客入侵的一种防护工具,一种确保网络安全的方法!
    允许网络管理员定义一个中心点来防止非法用户进入内部网络。2.可以很方便地监视网络的安全性,并报警。3.可以作为部署NAT(Network Address Translation,网络地址变换)的地点,利用NAT技术,将有限的IP地址动态或静态地与内部的IP地址对应起来,用来缓解地址空间短缺的问题等
    
    
  12. select、poll、epoll 模型的区别?

    https://www.cnblogs.com/linhaifeng/articles/7454717.html

    (1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用 epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在 epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的 时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
    
    (2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要 一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内 部定义的等待队列)。这也能节省不少的开销。
    
    
  13. 简述 进程、线程、协程的区别 以及应用场景?

    1.
    线程和进程:
    线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
    线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(
        如程序计数器、一组寄存器和栈)。
    2.
    线程、进程与协程:
    线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员
    协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保持状态,下次继续)。协程,则只使用一个线程,
    在一个线程中规定某个代码块执行顺序。
    协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用于协程;
    
    
  14. GIL锁是什么鬼?

    GIL即全局解释器锁,全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。而这个
    解释器锁由于历史原因,现在几乎无法消除。
    
    python GIL 之所以会影响多线程等性能,是因为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行,而全局锁只有一个,
    所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能
    
    
  15. Python中如何使用线程池和进程池?

    Threadpool和ProcessPool模块。
    
    
  16. threading.local的作用?

    Threading.local可以创建一个对象, 每个线程都可以对他读写属性, 但不会互相影响
    threading.local()这个方法的特点用来保存一个全局变量,但是这个全局变量只有在当前线程才能访问,如果你在开发多线程应用的时候  需要每个线程保存一个单独的数据供当前线程操作,可以考虑使用这个方法,简单有效。举例:每个子线程使用全局对象a,但每个线程定义的属性a.xx是该线程独有的,Python提供了 threading.local 类,将这个类实例化得到一个全局对象,但是不同的线程使用这个对象存储的数据其它线程不可见(本质上就是不同的线程使用这个对象时为其创建一个独立的字典)
    
    
  17. 进程之间如何进行通信?

    进程间通信(IPC,Interprocess communication),方法包括管道(PIPE)、消息排队、旗语、共用内存以及套接字(Socket)
    
    
  18. 什么是并发和并行?

    并发是指一个处理器同时处理多个任务。
    并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
    并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生
    
    
  19. 进程锁和线程锁的作用?

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

    异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
    非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态。
    
    
  21. 路由器和交换机的区别?

    (1)工作层次不同   
    
    最初的的交换机是工作在OSI / RM开放体系结构的数据链路层,也就是第二层,而路由器一开始就设计工作在OSI模型的网络层。
    由于交换机工作在OSI的第二层(数据链路层),所以它的工作原理比较简单,而路由器工作在OSI的第三层(网络层),可以得到更多的协议信息,
    路由器可以做出更加智能的转发决策。   
    (2)数据转发所依据的对象不同   
    
    交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用不同网络的ID号(即IP地址)来确定数据转发的地址。
    IP地址是在软件中实现的,描述的是设备所在的网络,有时这些第三层的地址也称为协议地址或者网络地址。MAC地址通常是硬件自带的,由网卡生产商来分配的,
    而且已经固化到了网卡中去,一般来说是不可更改的。而IP地址则通常由网络管理员或系统自动分配。   
    (3)传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域由交换机连接的网段仍属于同一个广播域,广播数据包会在交换机连接的所有网段上传播,
    在某些情况下会导致通信拥挤和安全漏洞。连接到路由器上的网段会被分配成不同的广播域,广播数据不会穿过路由器。虽然第三层以上交换机具有VLAN功能,
    也可以分割广播域,但是各子广播域之间是不能通信交流的,它们之间的交流仍然需要路由器。   
    (4)路由器提供了防火墙的服务  
    
    路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和未知目标网络数据包的传送,从而可以防止广播风暴。
    
    
  22. 什么是域名解析?

    域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,
    采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
    
    
  23. 如何修改本地hosts文件?

    记事本打开C:\Windows\System32\drivers\etc下的hosts文件进行修改
    
    
  24. 生产者消费者模型应用场景及优势?

    应用于一个生产数据一个处理数据的场景
    优势生产者和消费者之间不直接进行通信 而是通过一个队列相当于一个缓冲区,平衡了生产者和消费者的处理能力
    生产者与消费者模式是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,而是利用阻塞队列来进行通讯,
    生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,实际应用中,生产者与消费者模式则主要解决生产者与消费者生产与消费的速率不一致的问题,
    达到平衡生产者与消费者的处理能力,而阻塞队列则相当于缓冲区。
    
    还有一个比较典型的例子便是日志的记录,多线程产生日志,但写日志由于文件独占,不能多线程来写,于是我们就可以把线程压入队列,由日志线程来读取队列数据,完成写日志的操作
    
    
  25. 什么是cdn?

    CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
    通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、
    负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决
    Internet网络拥挤的状况,提高用户访问网站的响应速度。
    
    
  26. LVS是什么及作用?

    LVS是Linux Virtual Server ,Linux虚拟服务器;是一个虚拟的服务器集群【多台机器LBIP】。LVS
    集群为三层结构:
    
    负载调度器(loadbalancer):它是整个LVS集群对外的前端机器,负责将client请求发送到一组服务器[多台LBIP]上执行,而client端认为是返回来一个同一个IP【通常把这个IP称为虚拟IP / VIP】
    
    服务器池(serverpool):一组真正执行client请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS
    
    共享存储(sharedstored):它为server pool提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务
    
    
  27. Nginx是什么及作用?

    1、静态HTTP服务器
    
    首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
    
    2、反向代理服务器
    
    什么是反向代理?
    
    客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,
    然后将结果返回给客户端,此时Nginx就是反向代理服务器。
    
    3、负载均衡
    
    当网站访问量非常大,网站站长开心赚钱的同时,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,
    将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
    
    4、虚拟主机
    
    有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
    
    例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,
    互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
    
    5、FastCGI
    
    Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)。
    
    
  28. keepalived是什么及作用?

    ??

    eepalived是一个类似于Layer2, 4, 7
    交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。
    
    keepalived的工作原理:
    keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下VRRP协议。
    
    VRRP协议:
    Virtual Route Redundancy Protocol虚拟路由冗余协议。是一种容错协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,
    从而保持网络通信的连续性和可靠性。
    
    
  29. haproxy是什么以及作用?

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
    
    HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上
    ,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
    
    HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,
    很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(
        User - Space)
    实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以
    使每个CPU时间片(Cycle)
    做更多的工作。
    
    
    
  30. 什么是负载均衡?

    负载平衡也称负载共享,是指对系统中的负载情况进行动态调整,以尽量消除或减少系统中各节点负载不均衡的现象。
    具体实现方法是将过载节点上的任务转移到其他轻载节点上,尽可能实现系统各节点的负载平衡,从而提高系统的吞吐量。
    负载共享有利于统筹管理分布式系统中的各种资源,便于利用共享信息及其服务机制扩大系统的处理能力。
    动态负载共享策略是指把系统中各节点上已有的负载作为参考信息,在运行过程中,根据系统中各节点的负载状况,
    随时调整负载的分配,使各节点尽可能保持负载的平衡。
    
    
  31. 什么是rpc及应用场景?

    调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,
    实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol)RPC调用的流程:
    
    1)服务消费方(client)调用以本地调用方式调用服务;
    
    2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
    
    3)client stub找到服务地址,并将消息发送到服务端;
    
    4)server stub收到消息后进行解码;
    
    5)server stub根据解码结果调用本地的服务;
    
    6)本地服务执行并将结果返回给server stub;
    
    7)server stub将返回结果打包成消息并发送至消费方;
    
    8)client stub接收到消息,并进行解码;
    
    9)服务消费方得到最终结果。
    
    
  32. 简述 asynio模块的作用和应用场景。

    asyncio模块提供了一种关于事件循环的框架。事件循环就是等待一些任务发生,然后执行相应的事件。它也会处理例如IO操作或者系统事件。
    asyncio实际中有好几种循环实现方式。模块默认使用的方式是其所运行的操作系统上最有效的方式。如果你愿意,你也可以显式地选择其它事件循环方式。
    一个事件循环就是当事件A发生时,函数B共同起作用。
    
    设想这样一个场景,服务器等待用户访问并请求一些资源,例如网页。如果这个网站不是非常知名的网站,这个服务器将会在很长的时间内处于空闲状态。
    但是,一旦某个时间用户点击了这个网站,服务器就需要作出响应。这个响应就是事件处理。当一个用户下载网页,服务器将会去检查并调用一个或者多个事件句柄。
    一旦这些事件句柄完成相应的处理,它们需要将控制交回给事件循环。为了在Python中完成这个任务,asyncio使用协程。
    
    协程是一个特殊的函数,可以将控制交回给它的调用函数,但是并不丢失它的状态。协程是一个消费者函数,并且是生成器的扩展。
    协程相比线程最大的优势就是执行协程时不需要占用太多内存。你需要注意的是,当你调用一个协程函数,它并没有真正执行。
    相反,它将会返回一个协程对象,你可以将这个协程对象传递给事件循环,然后可以立即或者稍后执行它。
    
    当你在使用asyncio模块时,另一个你可能会执行的是future。future就是一个可以表示还没有结束的任务结果的对象。
    你的事件循环可以观察future对象并等待它们结束。当一个future结束时,它被设置为已完成。asyncio模块也支持锁和信号。
    
    
  33. 简述 gevent模块的作用和应用场景。

    gevent是第三方库,通过greenlet实现协程,其基本思想是:当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,
    再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
    
    由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey
    patch完成
    
    使用gevent,可以获得极高的并发性能,但gevent只能在Unix / Linux下运行,在Windows下不保证正常安装和运行。
    
    由于gevent是基于IO切换的协程,所以最神奇的是,我们编写的Web
    App代码,不需要引入gevent的包,也不需要改任何代码,仅仅在部署的时候,用一个支持gevent的WSGI服务器,立刻就获得了数倍的性能提升。
    
    
  34. twisted框架的使用和应用?

    Twisted应用的基本问题,可说是“一个中心,两个基本点”,即:
    
    以“事件”event为中心,以
    "建立连接"
    connect和“定义反馈“callback为基本点。
    
    Twisted
    对event
    的管理机制,可划分为后台和前台两种形式。
    
    后台的管理,是Twisted
    框架的内在机制,自动运行,对程序员透明无须干预,在程序文本中不见其踪迹。
    
    前台的管理,是Twisted
    授权程序员,在程序文本中显式写码来实现。程序员的工作,主要是按照既定的方式,实现
    event。我们所关心、所用到的,是这部分东西(API)。
    
    

posted @ 2019-06-21 17:49  搞事^o^Boy  阅读(111)  评论(0)    收藏  举报