深拷贝 

1.对象A拷贝,生成对象B,且我们修改对象B(对象A)中的数据或方法,对象A(对象B)不会受影响,这就是深拷贝
2.对于可变与不可变类型

对于不可变类型,深拷贝会和浅拷贝一样,拷贝的是引用,不会创建新的内存地址

对于可变类型,深拷贝会拷贝每一层,新建内存地址进行储存

浅拷贝

1.对象A拷贝,生成对象B,且我们修改对象B(对象A)中的数据或方法,对象A(对象B)会受影响,这就是浅拷贝
2.(浅拷贝是对一个对象父级(最外层)的拷贝,并不会拷贝子级(内部))

对于不可变类型,浅拷贝仅仅是地址指向,不会开辟新空间

对于可变类型,浅拷贝只是引用原数据,会跟着原数据的改变而改变

可变与不可变数据类型

可变数据类型 :可以在原数据的基础上进行修改,修改后内存地址不变

常见的可变类型

列表(list)、字典(dictionary)、集合 (set)

不可变数据类型:不能在原数据基础上进行修改,重新赋值后内存地址改变

常见的不可变类型

字符串(str)、数字(number)、元组 (tuple)

垃圾回收机制

引用计数

当一个对象的引用被创建时,对象的引用计数加1,当一个对象的引用被移除时,对象的引用就是减1,当对象的引用计数为0时,就意味着对象已经不再被使用,可以将其内存释放掉

标记清除

标记清除 是 建立在引用计数技术基础之上
当引用计数为0的时候就给这个对象打上一个标签”可清除“,但是不会立马清除,而是会等到系统给程序分配的内存要用完之时,停下来将可清除标签的对象销毁然后继续。

分代回收

分代回收 是 建立在标记清除技术基础之上
分代回收共分为三个“代”:年轻代、中年代、老年代,他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小

新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,

当中年代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到老年代去,

依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内

同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象.

TCP/UDP

TCP

TCP 文件的上传下载(发送邮件、网盘、缓存电影)
1. 可靠、慢、全双工通信
2. 建立连接的时候 : 三次握手
3. 断开连接的时候 : 四次挥手
4. 在建立起连接之后
- 发送的每一条信息都有回执 *
- 为了保证数据的完整性,还有重传机制
5. 长连接 :会一直占用双方的端口
6. IO(input,output)操作,输入和输出是相对内存来说的
- write / send -----> 输出output
- read / recv ------> 输入input
7. 能够传递的数据长度几乎没有限制

TCP三次握手

TCP三次握手

第一次握手:建立连接时,客户端发送SYN包到服务端,并进入SYN_SENT状态,等待服务器确认。

SYN:同步序列编号

第二次握手:服务器收到SYN包,必须确认客户的SYN包,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入,ESTABLISHED(TCP连接成功)状态,完成三次握手。

TCP四次挥手

第一次挥手:首先客户端向服务端发送断开请求

(客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u)

第二次挥手:服务端向客户端进行回复

(服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一)

第三次挥手:服务端向客户端断开请求

(关闭服务器到客户端的连接,发送一个FIN给客户端)

第四次挥手:客户端收到消息后进行回复

(客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭)

UDP

- 1.无连接的 速度快
- 2.可能会丢消息
- 3.能够传递的数据的长度是有限的,是根据数据传递设备的设置有关系
UDP 即时通信类的(qq、微信、飞秋)

TCP/UDP的区别和优缺点

UDP是面向无线连接的通讯协议,UDP数据包括目标端口和源端口信合

优点:UDP传递速度快、操作简单、系统资源占用较少,由于通讯不需要连接,可以实现广播发送

缺点:UDP传输数据前并不与对方建立连接,对接受的数据不用发送确认信号,发送端不清楚数据是否成功发送,也不会重复发送,不可靠

TCP是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手,关闭连接

优点:TCP在数据传递时,有确认、窗口、重传、阻塞等等控制机制,能保证数据正确性,较为可靠

缺点:TCP相对于UDP速度慢一些,对系统资源占用较多

HTTP发送请求的流程

1.1 浏览器根据域名解析IP地址
1.2 浏览器与WEB服务器建立一个TCP连接
TCP的3次握手。
1.3 浏览器给WEB服务器发送一个HTTP请求
一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。其中有get和post请求 说一下两个请求的应用场景
1.4 服务器端响应HTTP请求,浏览器得到HTML代码
1.5 浏览器解析HTML代码,并请求HTML代码中的资源
1.6 关闭TCP连接,浏览器对页面进行渲染呈现给用户

HTTP常见的状态码

1. 100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求能完成整个处理过程。
2. 200-299:表示服务器成功接收请求并已经完成处理,常用200(ok请求成功)。
3. 300-399:为完成请求,客户需要进一步细化请求,例如:302(所有请求页面已经临时转移新的url),304,307(使用缓存资源)。
4. 400-599:服务器出现错误,常用500(请求未完成,服务器内部遇到不可预知的错误)

HTTP常见的请求头

1. Host(主机和端口号)
2. Connection(连接类型)
3. Upgrade-Insecure-Requests(升级为HTTPS请求)
4. User-Agent(浏览器名称)
5. Accept(传输文件类型)
6. Referer(页面跳转处)
7. Accpet-Encoding(文件编解码格式)
8. Cookie(Cookie)
9. x-requested-with:XMLHttpRequest(Ajax异步请求)

如何解决HTTP黏包问题

重新在写一个http协议就行

工作中常用到的python第三方库有哪些 还有一些包

re os sys json

参考博客:

进程线程协成

进程

进程是资源分配的最小单位
进程之间数据不共享 ,所以需要进程通信
通信的三种方式
1. 进程队列queue
2. 管道pipe
3. 共享数据manage
进程池
开多进程是为了并发,通常有几个cpu核心就开几个进程,但是进程开多了会影响效率,主要体现在切换的开销,所以引入进程池限制进程的数量。
这时候就用到了进程池,进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

线程

1. 线程是操作系统能够进行运算调度的最小单位
2. 线程是包含在进程中的
3. 进程自己是无法执行的,是靠线程进行执行的
线程池
1. 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
2. 线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。

协成

什么是协程
1. 协程是微线程
2. 协程拥有自己的寄存器上下文和栈
3. 协程能保留上一次调用时的状态
为什么能处理并发
1. 遇IO组自动切换
2. 内部封装的有Greenlet模块(遇到IO手动切换) 和 Gevent模块(遇到IO自动切换)
Greenlet
遇IO操作 手动切换
Gevent
Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程
其实Gevent模块仅仅是对greenlet的再封装,将I/O间的手动切换变成自动切换
Gevent原理是只要遇到I/O操作就会自动切换到下一个协程

迭代器、生成器、装饰器

装饰器应用场景

1. 引入日志
2. 函数执行时间统计
3. 执行函数前预备处理
4. 执行函数后清理功能
5. 权限校验等场景
6. 缓存
7. 事务处理

装饰器必须准寻的原则

1. 不修改被装饰器的函数的源代码
2. 不修改装饰器函数的调用方式
3. 在满足前者条件的情况下增加额外的功能

静态方法,类方法,属性方法,魔法方法

1.静态方法需要修饰器@staticmethod来标识,告诉解释器这是一个静态方法
特性: 静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
2.类方法需要修饰器@classmethod来标识,告诉解释器这是一个类方法
作用:无需实例化直接被类调用
特性: 类方法只能访问类变量,不能访问实例变量
3.属性方法需要修饰器@property来标识,告诉解释器这是一个属性方法
4.__ doc __  表示类的描述信息
__ call __ 对象后面加括号,触发执行
__ str __ 如果一个类中定义了__ str __方法,在打印对象时,默认输出该方法的返回值
__ dict __ 查看类或对象中的所有成员
new和init的区别
    1、 new是一个静态方法,而init是一个实例方法.
    2、 new方法会返回一个创建的实例,而init什么都不返回.
    3、 只有在new返回一个cls的实例时后面的init才能被调用.
    4、 当创建一个新实例时调用new,初始化一个实例时用init.

 

我爱工作,工作使我快乐!