1.Python是如何进行内存管理的?
答: 从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
一、对象的引用计数机制
Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
2. 垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。
然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。
(从而导致内存泄露)。
为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
3. 内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
4. 什么是lambda函数?它有什么好处?
答:lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
lambda函数:首要用途是指点短小的回调函数
lambda [arguments]:expression
>>> a=lambdax,y:x+y
>>> a(3,11)
5. Python里面如何实现tuple和list的转换?
答:直接使用tuple和list函数就行了,type()可以判断对象的类型
6. 请写出一段Python代码实现删除一个list里面的重复元素
答:
1,使用set函数,set(list)
2,使用字典函数,
>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]
>>> b={}
>>>b=b.fromkeys(a)
>>>c=list(b.keys())
>>> c
7. 编程用sort进行排序,然后从最后一个元素开始判断
a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a.sort()
last=a[-1]
for i inrange(len(a)-2,-1,-1):
if last==a[i]:
del a[i]
else:last=a[i]
print(a)
8. Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
答:赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
9. 介绍一下except的用法和作用?
答:try…except…except…[else…][finally…]
执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。
10. Python中pass语句的作用是什么?
答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass
11. 介绍一下Python下range()函数的用法?
答:列出一组数据,经常用在for in range()循环中
12. 如何用Python来进行查询和替换一个文本字符串?
答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
>>> import re
>>>p=re.compile(‘blue|white|red’)
>>>print(p.sub(‘colour’,'blue socks and red shoes’))
colour socks and colourshoes
>>>print(p.sub(‘colour’,'blue socks and red shoes’,count=1))
colour socks and redshoes
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量
13. Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
>>>print(re.match(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.match(‘super’, ‘insuperable’))
None
>>>print(re.search(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.search(‘super’, ‘insuperable’).span())
(2, 7)
14. Python里面如何生成随机数?
答:random模块
随机整数:random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。
随机实数:random.random( ):返回0到1之间的浮点数
random.uniform(a,b):返回指定范围内的浮点数。
15. 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行codingstandard检查
16. 如何在一个function里面设置一个全局的变量?
答:解决方法是在function的开始插入一个global声明:
def f()
global x
17. http 和 https 的区别?
1. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
2. http适合于对传输速度、安全性要求不是很高,且需要快速开发的应用。如web应用,小的手机游戏等等。而https适用于任何场景。
18. 爬虫使用多线程好?还是多进程好?为什么?
对于IO密集型代码(文件处理,网络爬虫),多线程能够有效的提升效率
(单线程下有IO操作会进行IO等待,会造成不必要的时间等待,而开启多线程后,
A线程等待时,会自动切换到线路B,可以不会浪费CPU的资源,从而提升程序的执行和效率)。
在实际的采集过程中,既考虑网速和相应的问题,也需要考虑自身的机器硬件的情况,来设置多进程或者多线程
对于爬虫采用多线程还是多进程,都需要根据具体的环境分析的
1.多线程爬虫的优缺点:
优点:
有效利用CPU时间,极大减小下载出错、阻塞对抓取速度的影响,整体上提高下载的速度,对于没有反爬虫限制的网站,下载速度可以多倍增加。
缺点:
对于有反爬的网站,速度提升有限的,提高了复杂度,对编码要求更高,线程越多,每个线程获得的时间就越少,
同时线程切换更频繁也带来额外开销,线程之间资源竞争更激烈
2.多进程爬虫的优缺点
**相对于多线程,多进程爬虫更重,更慢,但也可靠**
多进程爬虫可以认为是分布式爬虫的基础,在单机上也可以用。
因为一般大型的网站的服务器都是采用分布式部署的,可以采用多进程同时在不同的服务器器上进行爬取
3.爬虫采用多线程还是多进程好
进程与线程是明显不同的,因为python本身由于GIL的关系,也就是它本质一个python进程只可能有一个线程,
不管说的是多少线程都是模拟出来的多线程,所以,你真要快速,这个要用多进程来处理
在python环境下,多进程稍稍比多线程好实现好理解一点
因为爬虫大多数都是运行在linux内核的服务器上面,而在linux操作系统下,多进程要比多线程更加合适,
因为调度开销和多线程差不多,但是进程性能更好。
如果在windows系统下跑爬虫的话,建议使用框架或者使用多线程。
19. 简述 with 方法打开处理文件帮我们做了什么?
whit 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都睡执行必要的"清理"操作,释放资源,
比如:文件使用后自动关闭线程中 锁的自动获取和释放等
with 语句即:"上下文管理器":在程序中用来表示代码执行过程中所处的前后环境
上下文管理器:含有 enter 和 exit 方法的对象
enter():语句执行之前执行该方法,通常返回一个实例对象,如果with语句有as目标,则把对象赋值给as目标
exit():执行语句结束后,自动调用exit()方法,用户释放资源,若此方法返回True,程序会忽略异常
使用环境:文件读写,线程锁的自动释放等
20. 函数装饰器有什么作用?请列举说明?
1,引入日志
2,函数执行时间统计
3,执行函数前预备处理
4,执行函数后清理功能
5,权限校验等场景
6,缓存
7,事务处理
21. Python中递归的最大次数1000 ?怎么改?
import sys
sys.setrecursionlimit(1500) # set the maximum depth as 1500
22. w、a+、wb 文件写入模式的区别
r : 读取文件,若文件不存在则会报错
w: 写入文件,若文件不存在则会先创建再写入,会覆盖原文件
a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾
rb,wb:分别于r,w类似,用于读写二进制文件
r+ : 可读、可写,文件不存在也会报错,写操作时会覆盖
w+ : 可读,可写,文件不存在先创建,会覆盖
a+ :可读、可写,文件不存在先创建,不会覆盖,追加在末尾
23. Python 是一种非常流行的编程语言,因此有许多不同的 Web 开发框架可供选择。以下是几个流行的 Python Web 框架的优缺点:
Django
优点:
全功能性:Django 是一个全功能性的 Web 框架,它包含了许多常见的 Web 开发任务所需的功能,如认证、路由、ORM 等等。
社区支持:Django 有一个庞大的开发者社区,可以提供各种支持和解决问题。
安全性:Django 在设计上考虑了很多安全性问题,并提供了许多内置的安全功能。
缺点:
学习曲线较陡峭:Django 是一个功能强大的框架,学习曲线相对较陡峭。
一些开发者认为 Django 的 ORM(Object-Relational Mapping)有点过于复杂。
Flask
优点:
轻量级:Flask 是一个轻量级的 Web 框架,代码简洁易懂,可以快速开发。
灵活性:Flask 具有很高的灵活性,开发者可以根据需要选择所需的功能。
易于扩展:Flask 通过使用 Flask 插件可以轻松扩展其功能。
缺点:
Flask 框架本身缺乏一些常用的功能,需要使用插件或库进行补充。
缺少强制性的文件组织规范,导致项目结构比较随意,可能需要开发者进行额外的组织和管理。
FastAPI
优点:
高性能:FastAPI 基于 Starlette 和 Pydantic 实现,具有异步、高性能的特点。
简单易用:FastAPI 的 API 设计非常简单,使用起来非常方便。
文档生成:FastAPI 内置了文档生成器,可以自动生成 API 文档。
缺点:
对于新手来说,学习曲线可能相对较陡峭。
由于是比较新的框架,社区可能相对较小,可能无法解决所有问题
Pyramid
优点:
灵活性:Pyramid 框架允许开发者根据项目需要进行灵活配置,可以进行微调和自定义。
易于扩展:类似 Flask,Pyramid 也可以通过使用插件轻松扩展其功能。
支持多种数据库:Pyramid 支持多种数据库,包括 PostgreSQL、MySQL 等等。
缺点:
在某些方面可能过于灵活,需要开发者在项目中进行额外的配置和设置。
需要开发者拥有一定的 Python 和 Web 开发经验才能熟练掌握。
Bottle
优点:
轻量级:Bottle 是一个非常轻量级的框架,仅有一个 Python 文件,易于上手。
简洁性:Bottle 的 API 简单易用,可以快速编写简单的 Web 应用。
缺点:
功能相对较少,不适用于大型复杂项目。
缺乏内置的 ORM,需要使用第三方库进行数据库操作。
CherryPy
优点:
高性能:CherryPy 的性能比其他框架要快,因为它是基于 Python 标准库构建的。
可扩展性:CherryPy 可以通过插件和扩展进行功能扩展。
缺点:
较少的社区支持和文档资料。
对于初学者来说,学习曲线相对较陡峭。
Tornado
优点:
高性能:Tornado 是一个高性能的框架,可处理大量并发请求。
可扩展性:Tornado 可以轻松地与异步 IO 库集成。
缺点:
学习曲线较陡峭,需要了解异步编程的概念。
缺少一些常用的功能,需要使用第三方库进行补充。
Web2Py
优点:
全功能性:Web2Py 是一个全功能性的 Web 框架,内置了很多功能,如表单处理、国际化支持等等。
易于使用:Web2Py 的 API 设计比较友好,使用起来非常方便。
安全性:Web2Py 在设计上考虑了很多安全性问题,并提供了一些内置的安全功能。
缺点:
对于一些高级用法需要更高的技能水平,比如自定义组件和插件。
在一些方面,Web2Py 比其他框架更加保守,可能不能满足一些特定的需求。
TurboGears
优点:
多种数据库支持:TurboGears 支持多种数据库,包括 SQLAlchemy 和 Ming。
易于扩展:TurboGears 通过使用 TurboGears 插件可以轻松扩展其功能。
可定制性:TurboGears 允许开发者自定义组件和插件。
缺点:
学习曲线相对较陡峭,需要了解一些先进的概念。
由于可定制性较高,可能需要开发者在项目中进行额外的配置和设置。
24. TCP 和 UDP 协议的区别是什么, 分别优缺点又是什么
TCP 和 UDP 是两种常见的传输层协议他们的区别有:
连接方式:TCP是面向连接的协议,UDP是无连接的协议,TCP在传输数据之前需要建立连接,二UDP不需要
可 靠 性:TCP是一种可靠的协议,它保证数据的传输是无差错,无丢失,有序的;
UDP是不可靠的协议,它不能保证数据传输的可靠性
传输效率:UDP比TCP更加高效,因为它不需要创建连接和维护状态信息,但是UDP的传输效率是以可靠性为代价的
应用场景:TCP适用于数据可靠性比较高的应用场景,例如:文件传输,电子邮件等
UDP适用于对数据效率要求高的应用场景,例如:实时音视频传输,在线游戏等
总的来说,TCP和UDP各有优缺点,可以根据具体应用场景选择合适的传输协议
25. 长连接 和 短连接 协议 的区别
长连接和短连接都是指TCP协议中的连接,是指客户端和服务器之间的连接。
在HTTP协议中,长连接和短连接的实现方式是通过HTTP头中的Connection字段来控制的。
如果Connection字段的值为keep-alive,则表示使用长连接;如果Connection字段的值为close,则表示使用短连接。
TCP的keep-alive机制是指在一定时间内没有数据传输时,客户端或服务器会发送一个探测包,以确认对方是否还存活。
如果对方没有响应,则认为对方已经断开连接,此时连接也会断开。
TCP的keep-alive机制可以避免长时间的空闲连接占用系统资源,提高系统的可靠性
短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
每次传输数据时都要重新建立一个连接和关闭连接
长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接
建立一次连接 可以无限传输数据,即使没有数据传输,连接也不会断开
优缺点:
长连接可以减少连接的建立和断开的次数,从而减少网络开销,提高效率
短连接会增加连接的建立和断开的次数,从而增加网络开销,降低效率
26. Python面向对象三大特性?
1、封装隐藏对象的属性和实现细节,仅对外提供公共访问方式。在python中用双下划线开头的方式将属性设置成私有的 。好处:1. 将变化隔离;2. 便于使用;3. 提高复用性;4. 提高安全性。
2、继承继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。即一个派生类继承基类的字段和方法。
3、多态一种事物的多种体现形式,函数的重写其实就是多态的一种体现 。Python中,多态指的是父类的引用指向子类的对象 。
27. Python可变与不可变数据类型的区别?
答:Python中看可变与不可变数据类型,主要是看变量所指向的内存地址处的值是否会改变 。 Python 的六种标准数据类型:数字、字符串、列表、元组、字典、集合。
不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)。
可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)。
28. Python中迭代器和生成器的区别?
Python中生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析,同时节省内存。除了创建和保持程序状态的自动生成,当发生器终结时,还会自动跑出StopIterration异常。
列表、元组、字典、字符串都是可迭代对象。
数字、布尔值都是不可迭代的。
29. Python中猴子补丁是什么?
在Ruby、Python等动态编程语言中,猴子补丁仅指在运行时动态改变类或模块,为的是将第三方代码打补丁在不按预期运行的bug或者feature上 。
在运行时动态修改模块、类或函数,通常是添加功能或修正缺陷。
猴子补丁在代码运行时内存中发挥作用,不会修改源码,因此只对当前运行的程序实例有效。
30. Python中的单例模式有几种实现方式?
1、用__new__特殊方法实现
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
2、使用装饰器实现
def singleton(cls):
_instance = {}
def inner(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return inner
@singleton
class Singleton:
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
3、类装饰器实现
class Singleton:
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self, *args):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls(*args)
return self._instance[self._cls]
@Singleton
class Singleton:
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
4、使用元类实现方式
class Singleton1(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super(Singleton1, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super(Singleton1, self).__call__(*args, **kwargs)
return self.__instance
class Singleton(metaclass=Singleton1):
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
31. 简述 OSI 七层协议
是网络传输协议,人为的把网络传输的不同阶段划分成不同的层次
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
五层划分为:应用层、传输层、网络层、数据链路层、物理层
物理层:网线,电缆等物理设备
数据链路层:Mac 地址
网络层:IP 地址
传输层:TCP,UDP 协议
应用层:FTP 协议,Email,WWW 等
32. 三次握手、四次挥手的流程
都发生在传输层
三次握手:
TCP 协议是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接。TCP 标志位(位码),有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) Sequence number(顺序号码) Acknowledge number(确认号码) 第一次握手:主机 A 发送位码为 syn=1,随机产生 seq number=1234567 的数据包到服务器,并进入 SYN_SEND 状态,主机 B 由 SYN=1 知道,A 要求建立联机
第二次握手:主机 B 收到请求后要确认联机信息,向 A 发送 ack number=(主机 A 的 seq+1),syn=1,ack=1,随机产生 seq=7654321 的包,并进入 SYN_RECV 状态
第三次握手:主机 A 收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确,主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1,主机 B 收到后确认 seq 值与 ack=1 则连接建立成功,两个主机均进入 ESTABLISHED 状态
以上完成三次握手,主机 A 与主机 B 开始传送数据
四次挥手:
因为 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭
服务器 A 发送一个 FIN,用来关闭 A 到服务器 B 的数据传送。服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加1。和 SYN 一样,一个 FIN 将占用一个序号
服务器 B 关闭与服务器 A 的连接,发送一个 FIN 给服务器 A
服务器 A 发回 ACK 报文确认,并将确认序号设置为收到序号加1
33. 什么是 C/S 和 B/S 架构
B/S 又称为浏览器/服务器模式。比如各种网站,jupyter notebook 等。优点:零安装,维护简单,共享性好。缺点:安全性较差,个性化不足
C/S 又称为客户端/服务器模式。比如微信客户端,Oracle 客户端等。优点:安全性好,数据传输较快,稳定。缺点:对 PC 机操作系统等有要求,当客户端较多时,服务器端负载较大
34. 数据库设计三大范式
建立科学的,规范的的数据库是需要满足一些规范的,以此来优化数据数据存储方式,在关系型数据库中这些规范就可以称为范式
第一范式:当关系模式 R 的所有属性都不能在分解为更基本的数据单位时,称 R 是满足第一范式的,简记为 1NF
关系模式R的所有属性不能再分解
第二范式:如果关系模式 R 满足第一范式,并且 R 的所有非主属性都完全依赖于 R 的每一个候选关键属性,称 R 满足第二范式,简记为 2NF
非主属性都要依赖于每一个关键属性
三范式:设 R 是一个满足第一范式条件的关系模式,X 是 R 的任意属性集,如果 X 非传递依赖于 R 的任意一个候选关键字,称 R 满足第三范式,简记为 3NF
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系
35. 列举一些 django 的内置组件
Admin 组件:是对 model 中对应的数据表进行增删改查提供的组件
model 组件:负责操作数据库
form 组件:生成 HTML 代码;数据有效性校验;校验信息返回并展示
ModelForm 组件:用于数据库操作,也可用于用户请求的验证
36. uwsgi,uWSGI 和 WSGI 的区别
WSGI:全称是 Web Server Gateway Interface,是一种描述 web server 如何与 web application 通信的规范。django,flask 等都遵循该协议
uwsgi:是服务器和服务端应用程序的一种协议,规定了怎么把请求转发给应用程序和返回; uwsgi 是一种线路协议而不是通信协议,在此常用于在 uWSGI 服务器与其他网络服务器的数据通信
uWSGI:是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。Nginx 中 HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换
37. 面向对象深度优先和广度优先是什么?
Python的类可以继承多个类,那么其寻找类方法的方式有两种:
当类是经典类时(主要在python2版本中的没有主动继承object的类),多继承情况下,会按照深度优先方式查找
当类是新式类时(python3版本中的所有类和python2中主动继承object的类),多继承情况下,会按照广度优先方式查找
简单点说就是:经典类是纵向查找,新式类是横向查找
38. 什么是异步非阻塞
同步异步指的是调用者与被调用者之间的关系
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值
异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者
阻塞非阻塞是线程或进程之间的关系
阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活
非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
39. 简述 logging 模块
logging 模块是 Python 内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比 print,具备如下优点:
可以通过设置不同的日志等级,在 release 版本中只输出重要信息,而不必显示大量的调试信息
print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging 则可以由开发者决定将信息输出到什么地方,以及怎么输出
简单配置:
import logging
logging.debug("debug log")
logging.info("info log")
logging.warning("warning log")
logging.error("error log")
logging.critical("critica log")
output
WARNING:root:warning log
ERROR:root:error log
CRITICAL:root:critica log
默认情况下,只显示了大于等于WARNING级别的日志。logging.basicConfig()函数调整日志级别、输出格式等
40. 你的项目中uwsgi部署的时候配置的进程是多少?你们在设计的时候考虑多少并发量?
答:uwsgi配置32进程,800线程,考虑1000并发量以上。
标签:__,面试题,收集,python,self,Python,线程,连接,cls
From: https://www.cnblogs.com/huangchunfang/p/17827417.html