Python后台开发参考面试题
一、Python相关
1.解释一下GIL
全局解释器锁,仅存在于CPython解释器中,作用是保证一个Python进程同一时刻只有一个线程在运行
产生原因:Python的线程是调用C语言的原生线程,当线程执行之后python解释器就无法对其进行控制,为了解决多线程之间数据完整性和状态同步,就有了GIL锁
释放时机:线程开始IO操作,解释器每隔100opcode(操作码)或15ms
解决方法:更换解释器;使用多进程;使用其他语言
2.Python3和Python2有什么不同
1.Python3默认编码是UTF-8,2为ASCII
2.Python3中只有int,2中有int跟long,其中int不能超过sys.maxint
3.Python3中print是一个函数,需要带括号,2中不需要
4.Python3中input接收到的是str,2中接受到的是int(raw_input接受str)
5.Python3中range返回的是可迭代对象(节省内存),2中是列表
3.什么是解释型语言和编译型语言
解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行,即解释一条代码,执行一条
优点:可移植好,只需系统有Python解释器就能运行;便于维护
缺点:执行速度慢,因为相比直接执行,多了一个翻译过程
编译型语言的程序只要经过编译器编译之后,每次运行程序都可以直接运行,不需要再次'翻译'
优点:执行速度快。
缺点:可移植性差,因为编译需要对操作系统的库做出链接,所以程序运行时需要用到特定的系统库
4.循环引用怎么产生的,如何解决
是什么:
解决方法:
1.弱引用:weakref.ref
2.手动回收:gc.collect()
例子:https://www.cnblogs.com/chen55555/p/11079223.html
5.简述Python内存管理机制
1.引用计数
2.分代回收
3.标记-清除
6.进程、线程、协程
进程:系统进行资源分配和调度的基本单位
多进程的出现大大提高了用户体验
线程:CPU调度的最小单位
原因:多进程虽然提高了系统运行的效率,也有COW等技术对进程进行优化,但是进程的频繁创建和销毁代价较大、资源的大量复制和分配耗时仍然较高,于是80年代出现了能够独立运行的单位——线程。
多线程之间可以直接共享资源,同时线程之间的通信效率又远高于进程间,将任务并发的性能再次向前推进了一大步。
协程:一种用户态的轻量级线程,即协程是由用户程序自己控制调度的
原因:协程的概念最早提出于1963年,45但由于其并不符合当时崇尚的的“自顶向下”的程序设计思想,未能成为当时主流编程语言的一部分。
随着技术的发展,虽然进程和线程大大提高了cpu的使用率,但一些场景下线程CPU时间片的大量切换其实是做了很多不必要的无用功,特别是Python中因为GIL锁的存在,其多线程很多时候并不能提高程序运行效率,于是协程的概念又开始发挥了作用
7.多线程和协程的区别及适用场景
8.如何保障线程安全
9.谈下你对多进程的理解
10.COW了解吗
11.LEGB是什么
二、数据库相关
1. MySQL存储引擎有哪些?他们的区别是
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。
MyISAM:插入数据快,空间和内存使用比较低。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。
2. Select count(*) 和count(1) 、count(name)哪个性能好?为什么
3. MySQL的索引有哪些
从物理存储角度
聚集非聚集
从逻辑角度
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
ps.
索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
4. 什么是覆盖索引
5. 聚集索引和非聚集索引差异在哪
6. 说下数据库范式
优化:以空间换时间的目的
没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
7. 事务隔离怎么保证
8. 简述MVCC机制
9. 死锁产生的条件?如何避免和解决死锁问题
死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
10. 间隙锁有什么好处
11. 外键有什么好处和缺点
12. MySQL的使用场景
13. binlog的作用
当有数据写到数据库是,还会把更新的SQL语句写入到对应的binlog文件里,在进行数据库的主从复制和数据恢复时就可以使用它
14. 主从复制的原理是?
1.主服务器Master将数据库的改变写入二进制日志文件,并维护一个等待从服务器连接的线程binlog_dump;
2.从服务器Slave会启动一个线程(IO Thread)和主服务器Master的binlog_dump线程建立连接,然后将数据
读取到从服务器Slave,并写入中继日志(Relay log);
3.从服务器Slave另一个线程(SQL thread)会从中继日志中读取数据,并在从数据库应用更新,完成数据同步。
15. 主从发生不一致如何解决
原因:
网络的延迟
主从两台机器的负载不一致
解决:
方法一:忽略错误后,继续同步
方式二:重新做主从,完全同步
16. 乐观锁和悲观锁区别在哪
就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会去检查这个数据是否被更改,是就拒绝更新,反之允许,可以使用版本号等机制。
就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁
观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销
总之,冲突几率大用悲观,小就用乐观。
17. sql注入是如何产生的?怎么预防
通过传入恶意数据,达到欺骗服务器的效果,比如 select * from xxx where id=传入
对传过来的数据进行过滤
18. Redis使用场景
做缓存,高频词查询修改
19. Redis怎么做持久化
20. Redis内存不够了怎么办
1,增加内存;
2,使用内存淘汰策略。
3,Redis集群。
21. Redis的数据类型有哪些
22. zset如何存储的
zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:
- 有序集合保存的元素数量小于128个
- 有序集合保存的所有元素的长度小于64字节
当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。
23. MongoDB使用场景
24. MongoDB和MySQL差异
25. MongoDB存储引擎有哪些
26. MongoDB和MySQL如何选择
27.. 列式数据库的好处及使用场景
高效的压缩率,不仅节省储存空间也节省计算内存和CPU.
大量数据
三、网络相关
1. 简述TCP三次握手、四次挥手
2. 为什么TCP握手是三次,不是一次,两次,四次,...
3. TCP挥手过程为什么是四次
4. TCP有哪些状态
5. TCP粘包是什么情况?怎么解决
6. 简单描述下一次完成的http请求过程
7. TCP和UDP区别
8. 说下rpc的原理
四、Linux相关
1. 怎么查看服务端打开了哪些端口
2. 查看当前系统负载命令是
3. CPU负载怎么理解,比如四核机器负载多少算超载
4. 你常用的运维命令有哪些
5. Syn flood是什么?怎么预防
6. centos和ubuntu差异
7. centos上防火墙怎么配置
8. 如查找指定文件内容中第三列以“ali”开头的所有行,输出其对应行的第一第二列
9. DevOps了解吗
五、框架相关
1. django和flask有什么区别
2. uwsgi作用是什么?进程数设为多少比较合适
3. tornado有用过吗
4. sanic框架了解吗?为什么sanic一般比其他框架性能好
5. nginx有哪些作用
6. nginx中location /test 和location =/test有什么区别吗
7. 同步异步和阻塞非阻塞怎么理解
8. 什么是多路复用
9.epoll有用过
六、算法相关
1. 常用的排序算法复杂度谈下?
2. 写一个你熟悉的排序算法
3. 单链表如何进行反转
4. 如何判断两个链表是否相交
5. 54张扑克牌,设计一个算法,打乱牌的顺序
6. 如何从1亿个整数中取出其中最大的1000个
7. 给定一组数,求其中任何一组顺序子集和最大的值。
例如下面一组数据: 1,2 , -4 , 7 , 8 , -2 , 4;
和最大的一组子集应该是:7 ,8 ,-2 , 4 (总和:17)
8. 给定一个整数数组和指定的数字和,求数组中相加等于指定和的所有子集,如:
输入: array = [2, 3, 7, 4, 10, 8, 6], sum = 10
输出: [2, 8], [3, 7], [4, 6], [10]