python面试之结尾篇
程序员文章站
2024-02-12 17:50:40
...
1.多线程,多进程和协程
进程:一个运行的程序,进程是系统调度和分配的最小单位,拥有自己独立的空间内存,进程之间不共享资源。
线程:调度执行的最小单位,依赖于进程,一个进程至少有一个线程,并且同一个进程内的线程之间共享资源,大大提升了程序运行速度,切换由系统调度。
协程:一种用户态的轻量级线程,切换由用户调度,拥有自己的上下文和栈,切换时将寄存器上下文和栈保存在别的地方,切换回来时,恢复先前的寄存器上下文和栈,直接操作栈基本没有内核的消耗,
所以切换速度较快。
2.什么是GIL
全局解释器所,每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。
3.并发和并行
并发:交替处理多个任务的能力;
并行:同时处理多个任务的能力;
4.一个线程让另一个线程去调用一个函数
import threading
def func1(t2):
print('正在执行函数func1')
t2.start()
def func2():
print('正在执行函数func2')
if __name__ == '__main__':
t2 = threading.Thread(target=func2)
t1 = threading.Thread(target=func1, args=(t2,))
t1.start()
5.同/异步和阻塞非阻塞
同步异步是针对调用者来说的,调用者发起一个请求后,一直干等被调用者的反馈就是同步,不必等去做别的事就是异步。
阻塞非阻塞是针对被调用者来说的,被调用者收到一个请求后,做完请求任务后才给出反馈就是阻塞,收到请求直接给出反馈再去做任务就是非阻塞。
6.threading.local()函数
from threading import get_ident,Thread
#字典存储
storage = {}
def set(k,v): # 来给storage设置值
ident = get_ident() # get_ident()能获取唯一标识,是一组数字
if ident in storage:
storage[ident][k] = v
else:
storage[ident] = {k:v}
print(storage)
return ident
#每个线程取值都必须带上自己的唯一标识
def get(k,ident): # 来取storage的值
print(ident)
return storage[ident][k]
def task(arg):
ident = set('val',arg)
v = get('val',ident)
print(v)
#threading.local()的作用就是为每个线程开辟一个独立的空间进行数据存储
#为了防止线程切换导致别的线程进入函数导致数据紊乱
for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
7.列举工作中常用的git 命令
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout –b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
git fetch 取代码
git rebase 合代码
等等等...