1、 三次握手四次挥手
 
tcp建立连接的过程是三次挥手,断开连接是4次挥手。
三次握手:建立连接时 a. 客户端发送syn=1 seq=k给服务器 b. 服务器接收到之后知道有客户端想建立连接,
为了确认, 发送 syn=1 seq=n ACK=1 ack=k + 1 c. 客户端收到后向服务器回复ACK=1 seq=k+1 ack=n+1确认 ,进入连接态,
服务器收到后进入连接态。
 
四次挥手: a. 主动方发送FIN=1 seq=n,进入结束等待1态 b. 被动方收到后回复ACK=1 ack=u+1 seq=v,进入等待关闭态
c. 主动方收到后进入结束等待2态 d. 被动方传输完数据后发送 FIN=1 ACK=1 ack=u+1 seq=w , 进入最后确认态 e. 主动收到
回复ACK=1, seq=u+1 ack=w+1 后进入时间等待态 f.被动方收到后关闭tcp, 主动方等待2个最长报文时间没有收到任何数据进入
tcp关闭状态
 
2. 进程、线程、协程的区别
 
进程:程序的启动就是一个进程,进程有独立的内存空间,相对比较稳定,但是创建、切换进程的时间开销大,
线程:线程是进程的最小单位,共享进程中的全部资源,上下文切换相对于进程来说很快,开销小,但是不稳定,容易丢失数据,python的多线程并不是真正的并发,不能真正使用多核cpu
协程:协程也可以叫做轻量级的线程,调度由用户自己控制,进程线程都是系统来进行调度,上下文切换非常快,没有内核切换的开销。
总结:如果计算密集型处理则采用多进程,如果是io密集型采用多线程或者多协程
 
3. 手写单例
 
a.
def singleton(cls):
    instanse = {}
    def get_single_ton(*args, **kwargs):
        if cls not in instances:
            instanse[cls] = cls(*args, **kwargs)
            return get_single_ton
 
@singleton
class MyClass():
    def foo(self):
        pass
 
b.
class SingleTon():
    def __new__(cls,):
        if cls not hasattr('ins'):
            cls.ins = super(SingleTon, cls).__new__(cls)
            return cls.ins
 
4. python常用的设计模式
 
单例、工厂、创造者、装饰器、生成器、适配器等
 
5. 深拷贝、浅拷贝
浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。
一个变量对另外一个变量的值拷贝。
 
6. 迭代器、生成器
 
a. 通过实现迭代器协议对应的__iter__()和next()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,
并且通过next()方法获得容器的下一个元素。
 
b. 生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。
 
c. 生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,生成器是一种特殊的迭代器, 在函数中使用yield就是一个生成器, 只能遍历一次
 
7. 垃圾回收
 
应用计数 标记清除 分代回收
 
8. session cookie区别
 
a、cookie数据存放在客户的浏览器上,session数据放在服务器上。
b、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
c、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
d、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
e、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
 
Cookie保存在客户端浏览器中,而Session保存在服务器上。
Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,
那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,
客户来访的时候只需要查询客户档案表就可以了。
 
 
9. 消息队列
 
为什么要用?
优点: 解耦、异步、消峰
缺点: mq一挂就崩 重复消息 数据不一致
 
redis: 是一个nosql数据库, 也支持mq功能。对于数据量小的场景性能很高,但数据超过10k就比较慢!
rabbitmq: 比较重量级,支持协议多, 对路由、负载均衡、数据持久化都有很好的支持
a. 由于erlang语言的特性,mq 性能较好,高并发;
b. 健壮、稳定、易用、跨平台、支持多种语言、文档齐全;
c. 有消息确认机制和持久化机制,可靠性高;
d. 高度可定制的路由;
e. 管理界面较丰富,在互联网公司也有较大规模的应用;
f. 社区活跃度高;
 
kafka:
a. 快速持久化,可以在O(1)的系统开销下进行消息持久化;
b. 高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;
c. 完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;
d.支持同步和异步复制两种HA;
e. 支持数据批量发送和拉取;
f. zero-copy:减少IO操作步骤;
g. 数据迁移、扩容对用户透明;
h. 无需停机即可扩展机器;
 
总结: 广泛来说,电商、金融等对事务性要求很高的,可以考虑RabbitMQ和RocketMQ,对性能要求高,大数据实时性、日志采集等场景的可考虑Kafka。
 
10. restful
 
编写api的一套协议规范, 面向资源编程,给调用者一个url, 根据请求方法后端做不同的处理。如post put get delete
而no rest就是给调用者多个url.
 
常见请求头: User-Agent Host Cookie Connetion Accept Accept-Language Accept-Encoding等
 
幂等: 一个接口通过1次相同的访问,再对该接口进行N次相同的访问时候,对资源不造影响,那么就认为接口具有幂等
 
11. 队列
 
quene模块
 
quene.Quene 单向队列
quene.LifoQuene 后进先出
quene.PriorityQueue 优先级s
quene.deque 双端
 
12. 数据库
 
redis与mongodb
 
完全不同的东西。
mongodb:最像关系型数据库的nosql。相比redis,只是缓存了热点数据在内存
redis:in-memory;丰富的数据结构;一般作为缓存,提高了并发性;
 
什么是NoSQL数据库?在哪些情况下使用和不使用NoSQL数据库?
 
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
 
1. 数据结构不同:关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。两者是不同的数据存储结构。
2. 成熟度:在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
3. 结构化: 在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
(1)mongodb所负责部分以文档形式存储,能够有较好的代码亲和性,json格式的直接写入方便。(如日志之类)
(2) 海量数据存储
(3)地理位置(匹配需求越多越合适,学习、开发、运维)
(4)监控数据, 加字段不用修改表结构
(5)大数据不可预计的增长
(6)第三方数据抓取
 
redis mysql?
redis 是内存数据库,数据保存在内存中,速度快。
mysql 是关系型数据库,持久化存储,存放在磁盘里面,功能强大。检索的话,会涉及到一定的 IO,数据访问也就慢。
一般需要永久存储的数据使用MySQL,比如用户信息,文章等
而临时数据或者经常访问的数据就会使用redis,比如用户的session/排行榜/访问计数/Pub Sub 构建实时消息系统/缓存等
 
mongodb mysql 不同
1. 事务
2. 非关系
3. 内存 + 持久
4. 成熟度
5. 广泛度
 
mongodb 语句
 
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
 
use db_name
db.dropDatabase()
db.collection.drop()
db.createCollection(name, optinos)
db.col2.insert({'':''}) client[][].insert_one() ~.insert_many()
 
13. 打印目录
 
import os
for root, dirs, files in os.walk(".", topdown=False):
    for name in files:
        print(os.path.join(root, name))
        for name in dirs:
            print(os.path.join(root, name))
 
 
14. 统计单词
 
.统计一个文本中单词频次最高的10个单词?
import re
 
# 方法一
def test(filepath):
 
distone = {}
 
with open(filepath) as f:
for line in f:
line = re.sub("\W+", " ", line)
lineone = line.split()
for keyone in lineone:
if not distone.get(keyone):
distone[keyone] = 1
else:
distone[keyone] += 1
num_ten = sorted(distone.items(), key=lambda x:x[1], reverse=True)[:10]
num_ten =[x[0] for x in num_ten]
return num_ten
 
 
# 方法二
# 使用 built-in 的 Counter 里面的 most_common
import re
from collections import Counter
 
 
def test2(filepath):
with open(filepath) as f:
return list(map(lambda c: c[0], Counter(re.sub("\W+", " ", f.read()).split()).most_common(10)))
 
 
17. 闭包
 
def multi():
return [lambda x : i*x for i in range(4)]
print([m(3) for m in multi()])
正确答案是[9,9,9,9],而不是[0,3,6,9]产生的原因是Python的闭包的后期绑定导致的,这意味着在闭包中的变量是在内部函数被调用的时候被查找的,因为,最后函数被调用的时候,for循环已经完成, i 的值最后是3,因此每一个返回值的i都是3,所以最后的结果是[9,9,9,9]
 
 
 
18. http socket websocket
 
1,传输层的TCP是基于网络层的IP协议的,
 
2,而应用层的HTTP协议又是基于传输层的TCP协议的,
 
3,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口.
 
 
 
websocket 和socket区别   
 
    
1,websocket是应用层的协议,而socket是传输控制层的协议.  
    
 
 websocket 和http区别        
 
 
相同点:
 
   1,都是应用层的协议
 
   2,都是基于tcp,并且都是可靠的协议
 
 
不同点:
 
    1,websocket是持久连接的协议,而http是非持久连接的协议.
 
 
   2,websocket是双向通信协议,模拟socket协议,可以双向发送消息,而http是单向的.
 
 
    3,websocket的服务端可以主动向客服端发送信息,而http的服务端只有在客户端发起请求时才能发送数据,无法主动向客户端发送信息.
 
 HTTPS和HTTP的区别主要为以下四点:
 
1、https协议需要到ca申请证书,一般免费证书很少,需要交费。
 
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
 
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
 
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
 
 
19.长连接和短连接
 
       
1,长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务端没有返回之前保持连接,当客户端再发送请求时,它会使用同一个连接。
这一直继续到客户端或服务器端认为会话已经结束,其中一方中断连接。
 
       优势:减少了连接请求,降低TCP阻塞,减少了延迟,实时性较好。
 
       劣势:可能会影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。
 
 2,短连接:在HTTP1.0中,客户端发送请求,服务器接收请求,双方建立连接,服务器响应资源,请求结束。
 
20. 加解密
 
具体过程是先由接收方创建RSA密钥对,接收方通过Internet发送RSA公钥到发送方,
同时保存RSA私钥。而发送方创建AES密钥,并用该AES密钥加密待传送的明文数据,
同时用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送到接收方。
当接收方收到这个被加密的AES密钥和密文后,首先调用接收方保存的RSA私钥,并用该私钥解密加密的AES密钥,得到AES密钥。最后用该AES密钥解密密文得到明文
 
 
21. 微服务
 
1. protobuf
 
google出品的一个序列化框架, 可以跨平台、跨语言使用,
扩展性良好,与xml json等序列化框架相同。广泛用于数据存储,网络传输,rpc
调用等环境!
 
2. http2
二进制而非文本格式
多路复用而非有序并阻塞,只需一个连接即可实现
报头压缩,降低开销
服务器推送
 
3. https
header body都加密
 
4. grpc
 
grpc主要使用场景:
 
低延时、高可用的分布式系统;
移动端与云服务端的通讯;
使用protobuf,独立于语言的协议,支持多语言之间的通讯;
可以分层扩展,如:身份验证,负载均衡,日志记录,监控等。
 
提升传输的效率,无用的报头
 
22. django flask
django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,,如果要实现高并发的话,
就要对django进行二次开发,比如把整个笨重的框架给拆掉自己写socket实现http的通信,底层用纯c,c++写提升效率,
ORM框架给干掉,自己编写封装与数据库交互的框架,ORM虽然面向对象来操作数据库,但是它的效率很低,
使用外键来联系表与表之间的查询;
flask: 轻量级,主要是用来写接口的一个框架,实现前后端分离,提考开发效率,
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,
用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、文件上传、身份验证等。
Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。

python web的一些常见技术面试笔试题的更多相关文章

  1. Web前端面试笔试题总结

    最近一段时间要毕业了,忙着找工作,见过不少笔试面试题,自己总结了一些加上网上找的一些整合了一下.答案暂时都东拼西凑出来了,但是还是先不发出来,一方面是答案并不是唯一的并且自己的答案不能保证对,另一方面 ...

  2. Java 面试/笔试题神整理 [Java web and android]

    Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...

  3. Android开发面试经——4.常见Android进阶笔试题(更新中...)

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  4. python面试笔试题汇总

    Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案

  5. Android开发面试经——3.常见Java基础笔试题

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  6. Android开发面试经——2.常见Android基础笔试题

     标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报  分类: Android开发(29)  版 ...

  7. java技术面试之面试题大全

    转载自:http://blog.csdn.net/lijizhi19950123/article/details/77679489 Java 面试知识点总结 本篇文章会对面试中常遇到的Java技术点进 ...

  8. 深圳市利汇电子商务科技有限公司2019年java面试笔试题

    垃圾公司,建议不要去,写的地址去了发现是两个公司公用一个办公场地,还没有公司的招牌,去了交简历给前台然后就是 填一份求职申请,一份笔试题如下,然后就等待,先是人事的一个小妹妹面试,问一些个人问题,为什 ...

  9. 分享18道Java基础面试笔试题(面试实拍)

    上图来自Java技术栈微信群里的群友分享,看起来比较基础,但不一定人人都答得上来. 图片比较模糊,小编把题目进行了文字化. 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求 ...

随机推荐

  1. 重点思维导图------redis深度历险

  2. c++中的几种函数调用约定(转)

    C++中的函数调用约定(调用惯例)主要针对三个问题: 1.参数传递的方式(是否采用寄存器传递参数.采用哪个寄存器传递参数.参数压桟的顺序等): 参数的传递方式,最常见的是通过栈传递.函数的调用方将参数 ...

  3. JS之DOM(一)

    一.DOM简介 什么是DOM?简单地说,DOM是是针对HTML和XML文档的一个API,一套对文档的内容进行抽象和概念化的方法. 学习过ORM的同学可能知道ORM是将数据库中的表映射到类,建立一个表和 ...

  4. shell简介及变量的定义查看撤销

    1.shell分类及相关软件  图形界面Shell(Graphical User Interface shell 即 GUI shell),如:GNOME.KDE 命令行式Shell(Command ...

  5. 12.java设计模式之代理模式

    基本介绍: 代理模式(Proxy)为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能,想在 ...

  6. new Date在不同浏览器识别问题

    原文 http://www.cnblogs.com/yangxiaopei/articles/4708157.html 4. 正确的做法 以下列出正确的做法: var time1 = (timesta ...

  7. Linux 入侵痕迹清理技巧

    清除history历史命令记录 vim ~/.bash_history //编辑history记录文件,删除部分不想被保存的历史命令 history -c //清除当前用户的history命令记录 H ...

  8. webug第四关:告诉你了flang是5位数

    第四关:告诉你了flang是5位数 开始看到有点懵 于是不要脸的看源码 burp跑弱口令

  9. NLP之统计句法分析(PCFG+CYK算法)

    一.认识句法分析 首先,了解一下句法分析到底是什么意思?是做什么事情呢?顾名思义,感觉是学习英语时候讲的各种句法语法.没错!这里就是把句法分析过程交给计算机处理,让它分析一个句子的句法组成,然后更好理 ...

  10. 面试官:小伙子,你给我说一下HashMap 为什么线程不安全?

    前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密. 1.jdk1.7中的HashMap 在jdk1.8中对HashM ...