python面试总结复习(二)

1.多线程是什么?多进程是什么?

进程:是操作系统进行资源分配和调度的基本单位,一个进程中最少有一个线程,每个进程之间相互不干扰。
线程:是CPU进行资源分配和调度的基本单位,一个进程中所有线程共享进程的资源
多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。。。

多进程:同时执行多个程序。如,同事运行YY,QQ,以及各种浏览器。

GIL锁

在Cpython解释器才有GIL的概念,不是python的特点。
python在设计的时候,还没有多核的概念。因此,为了设计方便与线程安全,直接设计了一个锁:GIL锁
在一个进程下,一次只能有一个线程执行,以此来保证数据的安全性。
从这也可以看出,为多线程分配多个CPU,多个CPU也不会起作用,因为每次只能执行一个线程。所以python中的线程只能实现并发,不能实现真正的并行。

并发、并行

并发:如果系统只有一个CPU,有多个线程在运行,不可能同时运行这些线程。通过CPU的调度,切换+保存状态实现并发,让用户看上去是同时执行。
并行:当系统有一个以上CPU时,一个CPU执行一个线程,另一个CPU执行另一个线程,两个线程互不抢占资源,可以同时进行,这种方式就叫并行。
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集 并发:你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 并行:你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

多线程、多进程    https://www.cnblogs.com/linuxAndMcu/p/11064916.html

多线程:指一个进程下同时有多个线程正在执行。多线程是异步的,多线程看着像是几个线程在同时运行,实际上是系统不断的在各个线程之间来回切换
多进程:指计算机同时执行多个进程

对于windows系统来说,开进程的时间开销很大,windows尽量使用线程。所以在windows学习重点是多线程的资源争抢和同步方面的问题

对于linux系统来说,开进程的时间开销很小,linux尽量使用进程,所以linux学习重点是多进程之间的通讯方式

 

多线程数据共享的安全问题(线程安全问题)

线程安全:因为一个进程中线程的数据是共享的,多条线程并行执行的过程中,各个线程都正常执行,且不会出现数据污染等情况。
为什么会出现线程安全问题:因为一个进程中线程的资源是共享的,如果多个线程操作了公共资源,有可能会产生安全问题
实现线程安全:使用互斥锁,同一时间只能有一个线程来修改共享的数据。互斥锁只有两种状态,上锁和解锁。在修改数据的代码前加上锁,修改完之后释放锁,等待其他线程抢锁。

进程间的通信

多进程通信:管道,命名管道,消息队列,共享内存、套接字

消息队列Queue:底层队列使用管道和锁定实现,q.get()往队列中取值,q.put往队列中放值。
进程间通过消息队列通信,主要是:创建或打开消息队列,添加消息,读取消息和控制消息队列

2.常见通信协议

应用层:HTTP
传输层:TCP/UDP
网络层:IP

TCP为什么是可靠的

因为TCP传递数据之前需要创建链接,并且有反馈机制,TCP三次握手

怎么解决粘包问题

发生粘包的原因:发送方执行发送命令(数据量过大),接收方一次只能接收一定量的数据,在下一次执行接收命令的时候接收的是之前没接收完的数据,这就产生了粘包。
粘包只会出现在TCP协议中,产生粘包的实际原因就是接收方不知道一次性接收多少字节的数据造成的
粘包的解决方案:
让发送端在发送数据前,把要发送的数据大小让接收端知道,然后接收端来一个死循环接收所有数据。
可以借助struct模块,把要发送的数据转换成固定长度的字节。这样客户端每次接收数据之前先接收这个固定长度的字节内容看一看接下来要接收的数据大小,最终接收到的数据只要达到这个值就停止。

3.sql注入及解决方案

sql注入问题:就是利用一些特殊符号巧妙的修改sql语句(比如mysql中的注释是--,会把--后面的)

解决方案:
1.特殊字符串过滤
2.不要手动拼接sql语句,可以使用execute拼接
3.参数验证
4.编码输出

4.怎么实现Django读写分离

先设置数据库主从同步大概的原理:
1.主库将变动的数据记录到日志文件中
2.主库有一个I/O线程,将日志文件发送到从库中
3.从库有一个I/O线程,将主库发送过来的日志文件写入到自己的日志文件中
4.从库有一个sql线程,按照自己的日志文件处理从库的数据
Django读写分离:
1.在settings文件中配置好主从库的地址
2.在view视图函数中,对数据库进行操作可以使用using(数据库名),来选择使用哪个数据库
主库用来写数据,从库用来读取数据  

5.为什么产生跨域问题,Django中怎么解决

跨站请求伪造 CSRF:伪装来自受信任用户的请求来访问受信任的网站,(攻击者盗用了你的身份,以你的名义发送恶意请求)

产生条件

1、用户要登录受信任的网站,并在本地生成cookie
2、在不退出安全网站的情况下,访问危险网站

解决方法

1.在表单中添加csrf_token
2.通过中间件 django.middleware.csrf.CsrfViewMiddleware
2.在请求地址中添加token并验证 3.在HTTP头中自定义属性并验证

跨域请求 CORS:因为现在很多项目都是前后端分离,并且前后端的项目部署也常常不在一个服务器内或者在一个服务器内的不同端口下,如果不做一些处理,就会受到浏览器同源策略的约束(ip地址和端口号都相同才是同一个域)

https://blog.csdn.net/weixin_44166997/article/details/94660234

解决方法

1.安装第三方模块 django-cors-headers
2.settings文件配置
INSTALLED_APPS = (
  'corsheaders',
)

MIDDLEWARE = [
  'corsheaders.middleware.CorsMiddleware',    #最好添加至第一行
]

6.Django中间件的流程,自定义的方法,process_view在什么时候执行?

https://www.cnblogs.com/yang-wei/p/10003940.html

1.Django中间件的流程
当请求到达中间件,先按照正序执行每个中间件的process_request方法,当process_request方法返回的是None,就依次往下执行。
如果返回值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应的中间件的process_reponse方法,将HttpResponse对象返回给浏览器。

process_view执行时间 process_request方法都执行完后,匹配路由,找到视图函数,先不执行视图函数,执行中间件的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完之后再执行视图函数。 如果process_view方法返回值是HttpResponse对象,则下面的process_view方法以及视图函数都不执行,直接从最后一个中间件的process_response方法开始执行

自定义的方法

process_request
process_response
process_view
process_exception   (当你的视图报错时,会自动执行)
process_template_response   (当你返回的HttpResponse对象中包含render属性才会执行)

process_view在什么时候执行  

在所有process_request都执行完,在路由匹配成功执行视图函数之前触发

 

posted @ 2020-04-12 14:16  只会玩辅助  阅读(642)  评论(1编辑  收藏  举报