面试遇到的python面试题 -- 2019年6月

1.python中线程和协程的区别,各自优缺点

1.区别:

  1. 线程可以并发运行,线程之间是不能共写全局变量(写冲突)。
  2. 协程不能并发运行,协程之间可以共享全局变量(不会存在写冲突)。
  3. 一个线程可以有多个协程,进程线程都是同步机制,而协程则是异步。
  4. 协程能够保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用状态

一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

2.优缺点

  1. 最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

  2. 第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

2.线程间共享变量如何保证不被其他线程改变

类似问法,flask/Django是如何实现不同线程中的request变量的
这里面用到了ThreadLocal变量,参见:https://selfboot.cn/2016/08/22/threadlocal_overview/

3.redis高并发如何实现

1.redis是基于内存的,内存的读写速度非常快;

2.redis是单线程的,省去了很多上下文切换线程的时间;

3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。

参见:https://zhuanlan.zhihu.com/p/58038188
io多路复用:https://www.jianshu.com/p/dfd940e7fca2

4.1000个.log文件查找带某字符串的linux命令

用grep -rn ‘字符串’ 文件夹路径
参考:https://blog.csdn.net/BabyFish13/article/details/79709028

5.自己编写的框架路由map如何实现

6.__new__和__init__区别 联系

__new____init__ 的区别主要表现在:
它自身的区别;
及在Python中新式类和老式类的定义。
__new__负责对象的创建而__init__ 负责对象的初始化。
__new__:创建对象时调用,会返回当前对象的一个实例
__init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值

1. 在类中,如果__new____init__同时存在,会优先调用__new__
class ClsTest(object):
    def __init__(self):
        print("init")
    def __new__(cls,*args, **kwargs):
        print("new")
  
ClsTest()

输出:

new
2. 如果__new__返回一个对象的实例,会隐式调用__init__
class ClsTest(object):
    def __init__(self):
        print ("init")
    def __new__(cls,*args, **kwargs):
        print ("new %s"%cls)
        return object.__new__(cls, *args, **kwargs)
  
ClsTest()

输出:

new <class '__main__.ClsTest'>
init
3. __new__方法会返回所构造的对象,__init__则不会。__init__无返回值。
class ClsTest(object):
     def __init__(cls):
             cls.x = 2
             print ("init")
             return cls
  
ClsTest()

输出

init
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() should return None, not 'ClsTest'
4. 若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行
class ClsTest1(object):
    pass
  
class ClsTest2(ClsTest1):
    def __init__(self):
        print ("init")
    def __new__(cls,*args, **kwargs):
        print ("new %s"%cls)
        return object.__new__(ClsTest1, *args, **kwargs)
  
b=ClsTest2()
print (type(b))

输出:

new <class '__main__.ClsTest2'>
<class '__main__.ClsTest1'>
5.知识点:
  1. 继承自object的新式类才有__new__
  2. __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,__new__必须要有返回值,返回实例化出来的实例,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
  3. __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
  4. 如果__new__返回一个对象的实例,会隐式调用__init__

7.rabbitmq 消息销毁、抛弃时候如何处理

8.迭代器生成器关系 区别

9.python3相比python2优点

10.Django中外键关联的表,如何插入数据

11.TCP协议和UDP协议的区别

12.TPC三次握手的过程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章