1.谈一下python的GIL锁 (1) 首先需要明确的是python和GIL没什么关系并不是python的特性,仅仅是由于历史的原因在CPython解释器中难以移除,因为python语言运行环境大部分默认在CPython解释器中。目的是解决多线程同时竞争程序中的全局变量而出现的线程安全问题
(2).GIL是python的全局解释器锁,同一个进程中有多个线程运行,单个线程在运行python程序的时候会占用python解释器(即加了一把锁就是GIL),使该进程内其他线程无法执行,每个线程在执行的过程中都需要先获取GIL,等该线程运行结束后其他线程才能运行。如果线程运行过程中遇到耗时操作,则GIL会暂时解开,让其他线程运行,但是在执行完毕后,必须重新获取GIL。所以在多线程中,线程的运行仍是有先后顺序的,并不是同步进行的。 python3以上版本使用计时器,即执行时间达到阈值后,当前线程释放GIL,python2使用计数的方式,达到100则释放GIL 解决方案:1.使用多进程 利用多核的CPU资源的2.使用其他解释器,如java的解释器jython
2.谈谈Django中的中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
(1)'django.middleware.security.SecurityMiddleware',
(2)'django.contrib.sessions.middleware.SessionMiddleware',
(3)'django.middleware.common.CommonMiddleware',
(4)'django.middleware.csrf.CsrfViewMiddleware',
(5) 'django.contrib.auth.middleware.AuthenticationMiddleware',
(6) 'django.contrib.messages.middleware.MessageMiddleware',
(7) 'django.middleware.clickjacking.XFrameOptionsMiddleware',
(1)XSS是一种攻击者可以用来将他们自己的代码注入到你的网站的跨站脚本。这可能会做一些恶意的事情,比如添加虚假内容或者监视你的用户窃取他们的密码。由于 XSS 是网站上常见的一种缺陷,浏览器在某些情况下添加了检测和防止这种漏洞攻击的功能,并捆绑在"XSS Auditors"中。默认情况下,这些安全功能都是启用的,所以看起来像 XSS 攻击的一些脚本会被阻止,但是页面会继续工作。
(4)
Csrf全局生效:中间件 django.middleware.csrf.CsrfViewMiddleware
局部生效: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
写法如下:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def test(request):
Django中使用ajax做post提交防止出现403错误的方法
以ajax发送一个请求,注意get和post的区别,post会被forbidden,get不会,
3.Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别) (1)runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server运行,主要用于测试和开发中使用,并且runserver开启的方式也是单进程的 (2)uWSGI是一个web服务器,它实现了WSGI,uwsgi,http等协议。注意uwsgi是一种通信协议,而uWSGI是实现了uwsgi和WSGI协议的web服务器 (3)uWSGI具有超快的性能,低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求和应用app隔离开,实现真正的部署。 相比来说,支持的并发量更高,方便管理多进程,发挥多核的优势提升性能。
4.python函数传参中,函数参数的传递是值传递还是引用传递? 在python中一切皆对象。所以函数的参数在传递过程中,传递的都是对象的引用,而引用是指向内存中的地址 所以该问题不严谨,应该问在python中函数参数为基本数据类型时,传递的是值传递还是引用传递 因为在实际使用时,不同数据类型表现出来的现象不一样,但是本质上都是传递的是对象的引用。因为不可变数据类型是不能在原内存地址上修改该值,其实就是把该数据类型复制了一份进行传递的,但事实上两个不同变量指向了同一个内存地址而已。而可变数据类型因为其在内存中的值是可以改变的,所以在函数内改变可变数据类型的值是会影响到函数外的变量,因为这两个参数是指向同一个内存地址的
5.如何查看占用8080端口的是什么进程?
(1)windows查看端口占用
在windows命令窗口下执行:
netstat -aon | findstr "8080"
(2)linux系统
先使用netstat命令,再用ps命令
执行命令: netstat -anp | grep 8080
输出结果: tcp 0 0 :::8080 :::* LISTEN 12006/java
执行命令: ps -ef | grep 12006
6.Django中FBV与CBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views) 就是在视图里使用类处理请求。
如果我们要写一个处理GET方法的view,用函数写的话是下面这样。
from django.http import HttpResponse
def my_view(request):
if request.method == 'GET':
return HttpResponse('OK')
如果用class-based view写的话,就是下面这样
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
return HttpResponse('OK')
Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提
供了一个as_view()静态方法(也就是类方法),
在url中,就这么写:
from django.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^index/$', MyView.as_view()),
]
7.代码优化从哪些方面考虑? (1)优化算法时间 算法的时间复杂度对程序的执行效率影响最大,在python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同场景不同的优化方式,总的来说一般有分治,分支界限,动态规划等思想 (2).循环优化 每种编程语言都会强调需要循环优化。当使用python时,可以依靠大量的技巧使得循环运行的更快。然而,开发者经常漏掉的一个方法时:避免在一个循环中使用点操作。每一次你调用str.upper,python都会求该方法的值。然而,如果你用一个变量代替求得的值,值就变成了已知的,python就可以更快的执行任务。优化循环的冠军,是要减少python在循环内部执行的工作量,因为python原生的解释器在那种情况下,真的会减缓执行的速度。(注意:优化循环的方法有很多,这只是其中的一个。例如:许多程序员都会说列表推导式是在循环中提高执行速度的最好方式。这里的关键是优化循环是程序取得更高执行速度的更好方式之一) (3).并行编程 因为GIL的存在,python很难充分利用多核CPU的优势。但是可以通过内置的模块multiprocessiong实现下面几种并行模式: **多进程:**对于CPU密集型的程序,可以使用multiprocessing和Process,pool等封装好的类,通过多进程的方式实现并行计算。但是因为进程中的通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有多大提高。 多线程: 对于IO密集型的程序,multiprocession.dummy模块使用muitiprocessing的接口封装threading,使得多线程编程变得非常轻松。 分布式:multiprocessing 中的 Managers 类提供了可以在不同进程之共享数据的方式,可以在此基础上开发出分布式的程序。
8.谈一谈自己对面向对象的理解? 三大基本特性 封装 a.封装就是将外界客观事物封装成抽象的类,并且对封装的数据和方法提供了不同级别的保护(私有,公有) 继承 b.继承可以让类的对象获得其它类型对象的属性和方法,它可以使用现有类的所有功能,并且在无需重新编写继承的类的情况下对这些功能进行拓展 多态 c.一个类示例的相同方法在不同情形下有不同的表现形式。多态机制具有不同内部结构的对象可以共享相同的外部接口。这意外着虽然针对不同对象的具体操作不同,但通过一个共同的类,他们(那些操作)可以通过相同的方式予以调用
五大基本原则 单一责任原则 d.指类的功能要单一,不能包罗万象,像一个人一样分配的工作不能太多,否则一天到晚虽然忙忙碌碌的但效率却高不起来 开放封闭原则 e.一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块原来只有服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下就能增加客户端功能实现代码。这要求在设计 之初,就应当将服务端和客户端分开,公共部分抽象出来 替换原则 f.子类应当可以替换父类并出现在父类能够出现的任何地方 依赖原则 具体依赖抽象,上层依赖下层 接口分离原则 h.模块间通过抽象接口隔离开,而不是通过具体的类强耦合起来
|