面试中的一些常见的问题

这里挖坑

python

python 的 GIL

python wiki 中对 GIL的解释

GIL(Global Interpreter Lock),全局解释器锁.

python的解释器,py文件的运行需要解释器。在cpython中,这个解释器不是线程安全的,他有一个全局锁,用于保证对象的线程安全。当多线程情况下运行时候。每次其实只有一个线程在运行,其他的线程都是在等待。这就导致python中的多线程并不能完全利用全部的cpu资源(如果是多核处理器的话).所以GIL的存在,使得python处理cpu密集型的任务时候效率低下,因为要不断切换浪费时间切换线程,而且无法利用所有的cpu资源。而在I/O密集型的任务有比较好的效率,因为处理耗时的I/O任务时,线程会释放GIL给其他线程.

关于解释器和编译器的区别: - 代码 -运行-> 解释器 --> cpu - 代码 -->编译器 -运行-> cpu

# coding=utf8
import time
import threading

def count(num):
while num > 0:
num -= 1


num = 10000000

start = time.time()
count(num)
count(num)
end = time.time()
print('共运行: {}'.format(end - start))


t1 = threading.Thread(target=count, args=(num,))
t2 = threading.Thread(target=count, args=(num,))
threads = [t1, t2]
start = time.time()
for t in threads:
t.start()
t.join()
end = time.time()
print('多线程共运行: {}'.format(end - start))

# 结果,多线程更慢
# 共运行: 0.858108997345
# 多线程共运行: 1.28467583656
# python3.6下
# 共运行: 1.553386926651001
# 多线程共运行: 1.5657341480255127

上面python3.6为什么将近慢了一倍? > python3 的 int 都默认为 long integer.所以会稍微慢一些. > 这里有一个python3 和python2 的表现的对比。部分对比中python3比python2快8%到48%。部分慢25%到54%[Speed] Benchmarks: Comparison between Python 2.7 and Python 3.6 performance

python的多线程,多进程, 协程

几种排序

快速排序

def sort_fast(alist):
pass

数据库

mysql 的索引

mysql 的 when case

先创建测试数据

create table testScore    
(
tname varchar(30) null,
ttype varchar(10) null,
tscor int null
);

insert into testScore values ('张三','语文',80);
insert into testScore values ('张三','数学',98);
insert into testScore values ('张三','英语',65);
insert into testScore values ('李四','语文',70);
insert into testScore values ('李四','数学',80);
insert into testScore values ('李四','英语',90);

查询每个人的分数

select
`tname`,
max(case `ttype` when '语文' then `tscor` else 0 end) '语文',
max(case `ttype` when '数学' then `tscor` else 0 end) '数学',
max(case `ttype` when '英语' then `tscor` else 0 end) '英语'
from testScore group by `tname`;

group 中的case when

select
`tname`,
case `ttype`
when '数学' then '理科'
else '文科'
end as '科别',
sum(`tscor`) as '总分'
from `testScore`
Group by
`tname`,
case `ttype`
when '数学' then '理科'
else '文科'
end;

orm 的 n + 1问题

缓存、队列

redis 的 持久化策略

官方说明(英文)

中文翻译

  • RDB 在指定的时间间隔内生成数据集的时间点快照
  • AOF 持久化记录数据库的所有操作命令,并在服务器重启时重新执行

缓存击穿、雪崩、穿透

  • 缓存雪崩:指大量缓存同时失效,使得查询直接落到数据库上,造成数据库短时间内承受大量请求而崩掉。
  • 缓存击穿:指某个热点key,短时间大量请求都在访问,当他过期时,所有的请求会突然都直接落到数据库上,造成数据库短时间内承受大量请求而崩掉。
  • 缓存穿透:当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增。

其他基础

tcp/ip协议,tcp的三次握手等

tcp/ip 是一个协议簇的统称,

tcp(transport control protocol)传输控制协议 udp(user datagram protocol)

http协议

Hyper Text Transfer Protocol(超文本传输协议) Hypertext Transfer Protocol -- HTTP/1.1

包括方法: GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE,CONNECT

url, uri 的区别

url(uniform resource locator) uri(uniform resource identifier) 从名字可以看出来uri是资源的唯一标识,而url是资源的定位 url是uri的一种

死锁

restful 规范