1.多进程和多线程
1.python多进程和多线程看这一篇就够了_T型人小付的博客-CSDN博客
2.多进程和多线程的实现:一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎
3.多线程的补充:一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎
进程和线程
进程是资源分配的最小单元。运行程序最少会需要一个进程,并且单核cpu一次最多运行一个进程。进程一般使用pid来进行唯一标识
线程是系统调度的最小单元。进程里面可以有多个线程,单核cpu一次最多运行一个线程,一个进程的线程可以分布在多个Cpu中,所以只有多核才能实现多个线程同时运行。
在大多数编程语言中因为切换消耗的资源更少,多线程比多进程效率更高
python中的GIL全局解释器锁
一个历史遗留问题,python中的每个进程都会有一个GIL,这个锁是为了保证线程之间的数据安全一致,GIL的存在会导致一个进程每次只能执行一个线程。
在使用IO密集型的操作时多线程有效,因为IO交互的时间较长,所以使用多线程更为轻量。
在使用CPU密集型的操作时多进程有效,多进程可以在多个CPU中运行,要尽可能的多利用CPU资源。
需要注意的是,即使有GIL锁的存在,依旧需要添加互斥锁。因为python的操作不只是一个原子操作,完成一个操作需要分成好几步,每一步都有可能被停下来去执行另一个操作,这个就会导致之前没做完的步骤被覆盖了。多线程间通讯也可以用queue,因为queue是对线程安全的,不需要额外加锁了。
2.python的内存管理
面试必备:Python内存管理机制 - 掘金
内存管理的核心
创建 - 内存池
销毁 - 垃圾回收(引用计数, 标记清除, 分代回收)
内存池
每次申请内存会导致存在非常多的内存碎片,使用内存池可以一次性申请一串连续的地址空间,减少内存碎片的产生。
level 3:用于存放python内置的类型
level 2:用于存放内存小于256kb的申请
level 1:用于存放内存大于256kb的申请,内部是使用C的malloc等方法
垃圾回收
主要使用引用计数:指被其他对象引用的次数,当计数为0时进行销毁。
- 引用计数增加的情况:
- 一个对象被分配给一个新的名字(例如:a=[1,2])
- 将其放入一个容器中(如列表、元组或字典)(例如:c.append(a))
- 引用计数减少的情况:
- 使用del语句对对象别名显式的销毁(例如:del b)
- 对象所在的容器被销毁或从容器中删除对象(例如:del c )
- 引用超出作用域或被重新赋值(例如:a=[3,4])
辅助使用分代回收:分为年轻代,中年代,老年代。我们认为存留越久的数据被使用的概率就越大,所以更应该保留。当某一代的内存创建和销毁到达了一定比例时就会触发当前代和更年轻代的GC
辅助使用标记清理:主要使用在list,dict等容易造成循环引用的位置,用于针对引用计数无法解决的循环引用的问题。遍历对象,如果当前对象是可到的我们进行标记,不可达对象则清除。同时如果有循环引用,会把循环引用的对象引用-1。
在python中,维护了一个refchain的双向循环环状链表,这个链表中存储程序创建的所有对象,每种类型的对象中都有一个0b_refcnt引用计数器的值,默认为1,当引用计数器变为0时会进行垃圾回收(对象销毁,refchain中移除)但是,在python 中,对于那些可以有多个元素组成的对象可能会存在循环引用的问题,为了解决这个问题,python又引入了标记清除和分代回收,在其内部维护了四个链表
refchain
0代 700个对象触发
1代 0代十次执行一次1代
2代 1代十次执行一次2代
3.封装继承多态
封装
封装是为了增加代码的复用性,减少对外展示的内容。
继承
继承是为了增加代码的复用性,让子类可以使用或者重写父类的方法。单/多继承:子类有一个/多个父类。继承链,当继承了多个父类的时候,根据继承的顺序来让子类明确使用什么父类的方法。
多态
多态是为了增加代码的复用性,不同的对象的同一个方法有不同的实现逻辑
鸭子类型
如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。所以只要对象有这个方法,就算当前方法父类不是当前这个类型,我们也可以使用。
4.*args和**kwargs含义
*args表示可变长非关键字参数
**kwargs表示可变长关键字参数
5.python关键字
略
6.其他推荐面试题
1.2022非常全面的Python常见基础面试题及答案 - 知乎
2.Python-Interview-Bible/Python面试宝典-基础篇-2020.md at master · jackfrued/Python-Interview-Bible · GitHub