python面试总结复习(一)
复习题链接:https://www.cnblogs.com/yzxing/p/10637270.html
1.说说项目都用到了什么技术?
熟悉自己简历写的项目涉及的知识点,做到能拓展
2.mysql索引的种类
从数据结构方面来说: hash索引,B+树索引 从功能逻辑来说: 主键索引(非空且唯一), 唯一索引(数据唯一), 普通索引(只是为了加快查询速度), 全文索引(现在很少用,默认只支持英文检索,一般都是使用ES) 从物理存储方面来说: 聚集索引 (聚集索引的叶子节点存放的是索引和真实数据) 非聚集索引 (非聚集索引的叶子节点存放的不是真实的数据,而是指向实际数据的指针)
3.索引建多有什么不好?
1.在更新表数据的时候会降低更新速度,因为在更新数据的同时,还需要去操作索引文件。
2.创建索引的时候也会创建索引文件,占用过多磁盘空间
4.mysql的引擎有什么(可以说一下存储引擎的索引实现)
1.MySQL5.5版本之后默认的存储引擎是InnoDB 2.MySQL5.5版本之前默认的存储引擎是MyISAM 3.MEMORY存储引擎 数据是保存在内存中
5.redis是单线程还是多线程的?
是单线程
原因:因为redis核心就是数据都是在内存中操作,使用单线程去操作效率就高。多线程是通过CPU去模拟出多个线程的情况,这样就存在上下文切换,效率会降低。
https://www.cnblogs.com/blogtech/p/11742057.html
什么时候使用多线程呢? 处理一些慢速设备:磁盘等
处理方法:使用异步,将请求和处理的线程不绑定在一起,请求的线程将所有请求都放在一个地方,等请求快满了,处理请求的线程再去处理这些请求。统一的写入磁盘,或者读磁盘。
https://blog.csdn.net/lch_2016/article/details/81078243
为什么Redis执行速度快?
1.因为绝大多数请求都是内存操作
2.采用单线程,避免了不必要的上下文切换
3.非阻塞IO-IO多路复用
6.redis的持久化机制
1.RDB
2.AOF
7.mongdb的数据存储结构是什么
8.python 中的类是由什么创建的 (元类)
9.怎么做并发编程
10. python 的常量池是什么(小整数池)
为了避免因创建相同的值而重复申请内存空间所带来的效率问题,python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象会被重复使用。
11.Python 中的内存地址怎么不一样
https://www.cnblogs.com/zhaoganggang/p/11309200.html
12.django知识点
13.python垃圾回收机制
引用计数:当内存中的数据没有任何的变量名与其有绑定关系,那么就会被自动回收
标记清除:当内存快要被某个应用程序占满的时候,会自动触发
分代回收:根据值的存活时间的不同,化为不同的等级,等级越高的垃圾回收机制扫描的频率越低
14.django的请求生命周期
当用户在浏览器中输入url时,url先经过wsgi,再经过中间件,最后url到路由映射表进行匹配,匹配成功就执行对应的view视图函数。
视图函数中利用ORM去操作数据库取出需要的数据,然后返回给视图函数,并且把取出的数据传递给Template模板,模板就是html文件,最后渲染给用户展示。
15.GIL全局解释器锁
在Cpython解释器才有GIL的概念,不是python的特点。
python在设计的时候,还没有多核的概念。因此,为了设计方便与线程安全,直接设计了一个锁:GIL锁
在一个进程下,一次只能有一个线程执行,以此来保证数据的安全性。
从这也可以看出,为多线程分配多个CPU,多个CPU也不会起作用,因为每次只能执行一个线程。所以python中的线程只能实现并发,不能实现真正的并行。
互斥锁、死锁
互斥锁:是一种简单的加锁方式来控制对共享资源的访问,用来保证每次只有一个线程访问资源,互斥锁只有两种状态,即上锁和解锁。
死锁:指两个或两个以上进程或线程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力作用,他们都无法进行下去
解决死锁方法使用递归锁:RLock,RLock可以被第一个抢到锁的人连续的加锁和释放锁,每加一次锁,锁计数加1,每释放一次锁,锁计数减1,只要锁的计数不为0,其他线程都只能等待
16.docker和虚拟机的区别
虚拟机是在硬件级别上进行虚拟化,而Docker是在操作系统的层面虚拟化;虚拟机通过开辟一块硬盘来搭建操作系统,而Docker则是复用操作系统;
虚拟机实现了操作系统之间的隔离,Docker只是进程之间的隔离,所以虚拟机隔离级别更高、安全性方面也更强,但是Docker的运行速度很快。
19.数据库的主从复制基于什么 (主从复制原理)
1.主库将数据变动记录在日志文件中 2.主库通过I/O线程将日志文件发送到从库中 3.从库通过I/O线程把主库发送过来的日志拷贝到自己的日志文件中 4.从库通过SQL线程,按照日志文件处理从库的数据