面试(一)

面试 (-)

Posted by ZW on May 10, 2021

Python 实现单例模式



def singleton(cls):
    _instance = {}

    def inner():
        if cls not in _instance:
            _instance[cls] = cls()
        return _instance[cls]

    return inner


@singleton
class Cls(object):
    def __init__(self):
        pass


Cls = singleton(Cls)

cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))


class Single(object):
    _instance = None

    def __new__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kw)
        return cls._instance

    def __init__(self, *args, **kw):
        pass


single1 = Single()
single2 = Single()
print(id(single1) == id(single2))

Python 生成器

with

它的语法形式是 with…as…,主要应用场景资源的创建和释放。

执行流进入 with 中的代码块时会执行__enter__方法,它会返回在这个上下文中使用的一个对象。

执行流离开 with 块时,则调用这个上下文管理器的__exit__方法来清理所使用的资源。

wsgi 协议

请求时Web服务器需要和web应用程序进行通信 协议

environ:字典,包含请求的所有信息 start_response:在可调用对象中调用的函数,用来发起响应,参数包括状态码,headers等

协程

多线程编程是比较困难的, 因为调度程序任何时候都能中断线程, 必须记住保留锁, 去保护程序中重要部分, 防止多线程在执行的过程中断。 asyncio 包

无需系统内核的上下文切换,减小开销;

无需原子操作锁定及同步的开销,不用担心资源共享的问题;

单线程即可实现高并发,单核 CPU 即便支持上万的协程都不是问题,所以很适合用于高并发处理,尤其是在应用在网络爬虫中。

怎么查看端口是否占用,systemd

netstat lsof

排序算法,快排最好情况和最差情况

redis 持久化

一种RDB持久化(原理是将Redis在内存中的数据库记录定时dump到磁盘上), fork出子进程 一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据将丢失。

另一种AOF(append only file)持久化,(原理是将Redis的操作日志以追加的方式写入文件)。 3种同步策略,及每秒同步,每修改同步和不同步

二者选择的标准:就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启动备份来换取更高的性能。待手动运行save的时候,再做备份(rdb)。RDB这个就更有些终极一致性的意思了

tcp 怎么保证可靠传输

校验和 序列号 确认应答 超时重传 连接管理 流量控制 拥塞控制

乐观锁 和 悲观锁

乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。

悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是对数据加锁(如MySQL中的排它锁)。

乐观锁的实现方式主要有两种:CAS机制和版本号机制,