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机制和版本号机制,