Python究极面试题02
Python面试究极题02
脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?
脏读:指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
不可重复读:指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
幻读:并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此数据,但执行 insert 时发现此记录已经存在,无法插入。此时就发生了幻读
https://www.cnblogs.com/liuqingzheng/p/16480047.html
什么是qps,tps,并发量, pv, uv
qps: Queries Per Second,每秒查询率,一台服务器每秒能够响应的查询次数
tps:Transactions Per Second,是每秒处理的事务数,包括一条消息入和一条消息出,加上一次用户数据库访问
并发量:系统同时处理的请求数量
pv(Page View):页面访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。可以统计服务一天的访问日志得到
UV(Unique Visitor): 独立访客,统计1天内访问某站点的用户数。可以统计服务一天的访问日志并根据用户的唯一标识去重得到
DAU(日活)DAU(Daily Active User): 日活跃用户数量,常用于反映网站、app、网游的运营情况。DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去重重复登陆的用户),与UV概念相似
MAU(Month Active User):月活跃用户数量,指网站、app等去重后的月活跃用户数量
什么是接口幂等性问题,如何解决?
幂等:幂等(idempotent、idempotence)是一个数学与计算机学概念
一个幂等操作的特点是其任意执行所产生的影响均与一次执行的影响相同
接口幂等性:无论调用多少次,产生的效果是一样的
get 获取数据天然幂等 put 修改数据天然幂等 delete 删除 天然幂等 post 新增数据,会出现不幂等的情况,要把它做成幂等性的 解决: 1.唯一主键 unique 新增哦那个胡用户名唯一,但是订单问题解决不了 2.token机制,随机字符串 -在使用新增之前,先生成一个随机字符串token,保存起来,只要调用新增接口,就必须携带随机字符串token,到后端,校验这个token在不在我们保存的里面,如果在,说明正常,删除token,允许新增,如果不在就不允许新增 3.前端: 按钮只能点击一次
什么是GIL锁
全局解释器锁,它的本质就是一个大的互斥锁,他是cpython的一个机制,GIL只存在cpython解释器,它限制了一个线程只有获取了GIL锁,才能执行,如果没有拿到GIL锁,线程是不能执行的
解释器不仅仅只有cpython,pypy,jpython
GIL锁的作用是什么
-保证数据安全? 用互斥锁就可以了,gil锁不能保证数据安全 python的垃圾回收机制,需要垃圾回收线程来做,如果同一时刻,有多个线程在同时执行,垃圾回收就可能会把正在其他线程使用的变量给回收掉,因为当时只有单核电脑,本来统一时刻就不能有多个线程同时执行,于是作者就干脆做了一个GIL锁,让线程必须获得GIL锁,才能执行,但后来随着多核的出现,导致python的多线程并不能利用多核
python的垃圾回收机制是什么样的?
引用计数:有多少个变量指向它,它的引用计数就为几,当引用计数为0,说明没有变量指向它了,这块内存空间就会被回收掉 ,引用计数存在循环引用问题
标记清除:是为了解决引用技术存在的循环引用的问题
第一阶段是标记阶段,它会把所有的 [活动对象] 打上标记,第二阶段是把那些没有标记的对象【非活动对象】进行回收
它会把循环引用的内存空间,打上标记,然后回收掉
分代回收:
把对象分为三代,一开始,对象在创建的时候,放在第一代,如果在一次一次的垃圾回收检查中,该对象存活下来,就会被放到二代中,同理在一次二代垃圾检查中,该对象存活下来,就会被放到第三代中,后面优先检查第一代的对象,优先回收,其次依次往上检查做回收
解释为什么计算密集型用多进程,io密集型用多线程
由于GIL锁的存在,即使是多核机器,同一时刻,也只能有一个线程在执行,线程需要cpu去调度执行。
如果开了多线程,是计算密集型,计算是消耗cpu,假设是四核电脑,不能充分利用这四个核,只能有一个核在执行,开多线程没有用
而如果计算机密集型,开了多线程,gil是在cpython解释器进程中的,再进程中开启线程执行计算,可以充分利用多核优势
开了一个进程,就开了一个cpython解释器的进程,就会有一个gil锁
由于GIL锁的存在,如果是计算密集型,开启多线程,不能利用多核优势。开启多线程,可以利用多核优势
io不耗费cpu,开启多线程,在一个时间段内是有并发效果的
# 即便是io密集型,用多进程是不是会显著提高效率? -本身开启进程是非常消耗资源的,如果是io密集型,没有必要开多进程,并不会有显著的效率提升
补充:
# 进程:进程是资源分配的最小单位,一个应用程序运行,至少会开启一个进程 # 线程: 线程是CPU调度的最小单位,cpu执行的最小单位 # 携程: 单线程下实现并发,代码层面遇到io,自己切换
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构