python面试

第一部分 python基础篇

1.简述解释型和编译型编程语言?

  • 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。
  • 编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统,把源高级程序编译成为机器语言文件,翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论

2.Python解释器种类以及特点?

Cpython、IPython、PyPy、Jython、IronPython

3.位和字节的关系?

  • bit:位,一个二进制数据0或1
  • byte:字节,存储空间的基本计量单位
  • 关系:1 byte = 8 bit

4.b、B、KB、MB、GB 的关系?

1GB=1024MB 1MB=1024KB 1KB=1024B

5.请至少列举5个 PEP8 规范?

  • 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
  • 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
  • 逗号、冒号、分号前不要加空格。
  • 函数命名使用全部小写的方式,可以使用下划线
  • 常量命名使用全部大写的方式,可以使用下划线。

6.列举python2和python3的区别

  • python3 使用 print 必须要以小括号包裹打印内容,比如 print('hi')
  • python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print 'hi'
  • python2 range(1,10)返回列表,python3中返回迭代器,节约内存
  • python2中使用ascii编码,python中使用utf-8编码
  • python2中unicode表示字符串序列,str表示字节序列
  • python3中str表示字符串序列,byte表示字节序列
  • python2中为正常显示中文,引入coding声明,python3中不需要
  • python2中是raw_input()函数,python3中是input()函数

7.xrange和range的区别?

  • range:根据start与stop指定的范围以及step设定的步长,生成一个序列。
  • xrange:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。
  • 区别:要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。

8.lambda匿名函数

通常在需要一个函数,但是又不想费神去命名一个函数的场合下使用

9.pass的作用

  • 不会执行任何操作
  • 保证格式完整
  • 保证语义完整

10.*arg和**kwarg作用

  • *args和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。
  • *args:用来发送一个非键值对的可变数量的参数列表给一个函数
  • **kwargs:允许你将不定长度的键值对,作为参数传递给一个函数

11.is和==的区别

  • ==:是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等
  • is:比较判断的是对象间的唯一身份标识,也就是id是否相同。

12.简述Python的深浅拷贝

  • 浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
  • 深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。

13.Python垃圾回收机制?

python垃圾回收主要以引用计数为主,标记-清除和分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。 1.引用计数算法 当有1个变量保存了对象的引用时,此对象的引用计数就会加1 当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1, 如果再调用1次del,此时会真的把对象进行删除 2.标记-清楚机制 基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象 打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。 3.分代技术 分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大 而减小,存活时间通常利用经过几次垃圾回收来度量

14.Python的可变类型和不可变类型?

1.不可变类型(数字、字符串、元组、不可变集合) 不可变的分类中没有哪个对象类型支持原处修改,尽管我们总是可以运行表达式来创建新的对象并将其结果分配给变量。 一般来说,不可变类型有某种完整性,保证这个对象不会被程序的其它部分改变。 2.可变类型(列表、字典、可变集合) 相反,可变的类型总是可以通过操作原处修改,而不是创建新的对象。尽管这样的可以复制,但原处修改支持直接修改。

15.求输出结果

v = dict.fromkeys(['k1','k2'],[])
v['k1'].append(666)
print(v)    #{'k1': [666], 'k2': [666]}
v['k1'] = 777
print(v)    #{'k1': 777, 'k2': [666]}

16.列举常见的内置函数?

input()
slice()
int()
open()
sum()
format()
compile()

17.一行代码实现9*9乘法表

print("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10)))

18.列举常用模块都有哪些?

time,random,os,sys,json,re,logging,hashlib

19.re的match和search区别?

match()从开始位置匹配string

search()整个string查找匹配。

20.正则表达式的贪婪和非贪婪匹配区别?

(.*)是贪婪匹配,会把满足正则的尽可能多的往后匹配


(.*?)是非贪婪匹配,会把满足正则的尽可能少匹配

21.如何实现[‘1’,’2’,’3’]变成[1,2,3] 

a = ['1','2','3']
b = [int(i) for i in a]
print(b)  #[1, 2, 3]

22.如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?

list = [i*i for i in range(1,11)]

23.谈谈你对闭包的理解?

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

第二部分 网络编程和并发

1.简述 OSI 七层协议

1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。 2.数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。 3.网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。 4.传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。 5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名) 6.表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。 7.应用层: 是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

2.简述 三次握手、四次挥手的流程。

三次握手: 第一次握手:客户端(client)发送SYN包到服务器(server),客户端(client)状态机进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器(server)接收到SYN包,必须发送ACK包到客户端,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端(client)接收到服务器发送的SYN+ACK包,必须向服务器发送确认包ACK,此包发送成功,则客户端和服务器同时进入ESTABLISHED状态。 四次挥手: 假设客户端发起断开连接请求, 第一次挥手:客户端(client)发送FIN报文到Server端 第二次挥手:服务器(server)收到客户端发送的FIN包之后,发送ACK包到客户端,客户端收到服务器发送的ACK之后,进入FIN_WAIT状态,等待server端发送FIN报文 第三次挥手:服务器(server)发送FIN报文到客户端 第四次挥手:客户端收到服务器发送的FIN报文之后,发送ACK包到服务器,服务器收到ACK之后即断开连接,等待一段时间TIME_WAIT之后,客户端发现服务器没有再发FIN过来,就知道服务器已经断开连接,此时客户端也进入断开连接状态。

3.什么是arp协议?

地址解析协议,即ARP(Address ResoluTIon Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。 作用:因为在局域网中,如果源主机要和目的主机建立通信关系,那么源主机必须要知道目的主机的MAC地址(即硬件地址),但是如果目的主机或者源主机是第一次进行通信的,那么源主机要怎样才能知道目的主机的MAC地址呢? 所以这样就引入了ARP地址协议。

4.TCP和UDP的区别?

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保   证可靠交付 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的   UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等) 4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 5、TCP首部开销20字节;UDP的首部开销小,只有8个字节 6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

5.什么是局域网和广域网?

一、局域网 局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、扫描仪共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。 二、广域网 广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合。通常跨越省、市,甚至一个国家。广域网包括大大小小不同的子网,子网可以是局域网,也可以是小型的广域网。

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

TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。而UDP就没有了,udp信息发出后, 不验证是否到达对方,所以不可靠。

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

 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 基于tcp协议流程: 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 连接。

8.什么是粘包? socket 中造成粘包的原因是什么? 

1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 2 为什么出现粘包现象 (1)发送方原因   我们知道,TCP默认会使用Nagle算法。而Nagle算法主要做两件事:1)只有上一个分组得到确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一起发送。   所以,正是Nagle算法造成了发送方有可能造成粘包现象。 (2)接收方原因   TCP接收到分组时,并不会立刻送至应用层处理,或者说,应用层并不一定会立即处理;实际上,TCP将收到的分组保存至接收缓存里,然后应用程序主动从缓存里读收到的分组。这样一来,如果TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,应用程序读时,就会读到多个首尾相接粘到一起的包。 3 什么时候需要处理粘包现象   (1)如果发送方发送的多个分组本来就是同一个数据的不同部分,比如一个很大的文件被分成多个分组发送,这时,当然不需要处理粘包的现象;   (2)但如果多个分组本毫不相干,甚至是并列的关系,我们就一定要处理粘包问题了。比如,我当时要接收的每个分组都是一个有固定格式的商品信息,如果不处理粘包问题,每个读进来的分组我只会处理最前边的那个商品,后边的就会被丢弃。这显然不是我要的结果。 4 如何处理粘包现象 (1)发送方   对于发送方造成的粘包现象,我们可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。 (2)接收方   遗憾的是TCP并没有处理接收方粘包现象的机制,我们只能在应用层进行处理。 (3)应用层处理   应用层的处理简单易行!并且不仅可以解决接收方造成的粘包问题,还能解决发送方造成的粘包问题。   解决方法就是循环处理:应用程序在处理从缓存读来的分组时,读完一条数据时,就应该循环读下一条数据,直到所有的数据都被处理;但是如何判断每条数据的长度呢?   两种途径:     1)格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候一定要注意每条数据的内部一定不能出现开始符或结束符;     2)发送长度:发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4位是数据的长度,应用层处理时可以根据长度来判断每条数据的开始和结束。   当时在做购物车的时候,我最开始的做法是设置开始符(0x7e)和结束符(0xe7),但在测试大量数据的时候,发现了数据异常。正如我所猜测,在调试过程中发现某些数据内部包含了它们。因为要处理的数据是量非常庞大,为做到万无一失,最后我采用了发送长度的方式。再也没有因为粘包而出过问题。

9.python的GIL

GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。 多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

10.进程之间如何进行通信?

进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等

11.什么是并发和并行?

并发:交替做不同事的能力 并行:同时做不同事的能力 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。 并发的关键是你有处理多个任务的能力,不一定要同时。 并行的关键是你有同时处理多个任务的能力。 它们最关键的点就是:是否是『同时』。

第三部分 数据库和缓存

 1.列举常见的关系型数据库和非关系型都有那些?

关系型:sqllite,db2,oracle,access,sql server MySQL 非关系型:MangoDB,redis

 2.MySQL常见数据库引擎及比较?

InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。  MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。 MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

 3.什么是事务?MySQL如何支持事务?

事务由一个或多个sql语句组成一个整体,要么完全地执行,要么完全地不执行。四大特点:原子性、一致性、隔离性和持久性。 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

 4.MySQL索引种类

普通索引、唯一索引、主键索引、组合索引和全文索引

 5.主键和外键的区别?

主键是用于唯一标识数据库表中一行数据的。 外键是建立与表与表之前的联系,方便程序的编写

 6.乐观锁和悲观锁

 悲观锁, 就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制,乐观锁适用于多读的应用类型,这样可以提高吞吐量

 第四部分 前端和框架

1.HTTP协议

http请求由三部分组成,分别是:请求行、消息报头、请求正文

HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

1、常用的HTTP方法有哪些?
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。

2、GET方法与POST方法的区别
区别一:
get重点在从服务器上获取资源,post重点在向服务器发送数据;
区别二:
get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;
post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
区别三:
Get传输的数据量小,因为受URL长度限制,但效率较高;
Post可以传输大量数据,所以上传文件时只能用Post方式;
区别四:
get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;
post较get安全性较高;
区别五:
get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。
post支持标准字符集,可以正确传递中文字符。

3、HTTP请求报文与响应报文格式

请求报文包含三部分:
a、请求行:包含请求方法、URI、HTTP版本信息
b、请求首部字段
c、请求内容实体
响应报文包含三部分:
a、状态行:包含HTTP版本、状态码、状态码的原因短语
b、响应首部字段
c、响应内容实体

4、常见的HTTP相应状态码

返回的状态
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求


200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙


5、HTTP1.1版本新特性
a、默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求

b、管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应

c、断点续传原理


6、常见HTTP首部字段
a、通用首部字段(请求报文与响应报文都会使用的首部字段)
Date:创建报文时间
Connection:连接的管理
Cache-Control:缓存的控制
Transfer-Encoding:报文主体的传输编码方式
b、请求首部字段(请求报文会使用的首部字段)
Host:请求资源所在服务器
Accept:可处理的媒体类型
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的内容编码
Accept-Language:可接受的自然语言
c、响应首部字段(响应报文会使用的首部字段)
Accept-Ranges:可接受的字节范围
Location:令客户端重新定向到的URI
Server:HTTP服务器的安装信息
d、实体首部字段(请求报文与响应报文的的实体部分使用的首部字段)
Allow:资源可支持的HTTP方法
Content-Type:实体主类的类型
Content-Encoding:实体主体适用的编码方式
Content-Language:实体主体的自然语言
Content-Length:实体主体的的字节数
Content-Range:实体主体的位置范围,一般用于发出部分请求时使用

7、HTTP的缺点与HTTPS
a、通信使用明文不加密,内容可能被窃听
b、不验证通信方身份,可能遭到伪装
c、无法验证报文完整性,可能被篡改

HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护


8、HTTP优化

利用负载均衡优化和加速HTTP应用

利用HTTP Cache来优化网站

2.简述jsonp及实现原理?

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。 原理: 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img、iframe、script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。而JSONP就是通过script节点src调用跨域的请求。当我们通过JSONP模式请求跨域资源时,服务器返回给客户端一段javascript代码,这段javascript代码自动调用客户端回调函数。

3.django、flask、tornado框架的比较?

  • Flask 扩展丰富,冗余度小,可自由选择组合各种插件,性能优越,相比其他web框架十分轻量级,其优雅的

     设计哲学易于学习掌握,小型项目快速开发,大型项目毫无压力,FLask灵活开发,python高手基本都会喜欢flask

  • Django 是重量级全栈型web框架,虽然功能强大,但冗余度高,自带ORM和模板引擎,灵活和自由度不够高

      开发小型项目时显得过于臃肿与庞大

  • Tornado 是一个强大的、支持协程、高并发且可扩展的web服务器,发布于2009年9月,应用于FriendFeed

      Facebook等社交网站。Tornado的强项在于可以利用他的异步协程机制开发高并发的服务器系统

4.什么是wsgi?

(1)、RESTful只是设计风格而不是标准,而WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是Python语言中所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。 (2)、WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券