你真的理解Python中MRO算法吗?

【前言】

MRO(Method Resolution Order):方法解析顺序
Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中一切皆引用,这使得他不会像C++一样使用虚基类处理基类对象重复的问题,但是如果父类存在同名函数的时候还是会产生二义性,Python中处理这种问题的方法就是MRO。

【历史中的MRO】

如果不想了解历史,只想知道现在的MRO可以直接看最后的C3算法,不过C3所解决的问题都是历史遗留问题,了解问题,才能解决问题,建议先看历史中MRO的演化。
Python2.2以前的版本:金典类(classic class)时代
金典类是一种没有继承的类,实例类型都是type类型,如果经典类被作为父类,子类调用父类的构造函数时会出错。
这时MRO的方法为DFS(深度优先搜索(子节点顺序:从左到右))。

Google Cloud初体验

【前言】

废话不多说,先上一图。

此处输入图片的描述

没有看错,速度很快,相对比较稳定,白天基本是100ms以内,晚上的时候会慢,点ping值差不多150ms左右,不过速度也算快的了。最主要的是他的最低配置只要5美元(共享cpu,0.6G内存,10G存储空间),很适合用来翻墙。不过高一档次的配置(内存1.75G)就要15美元了。穷人的话(比如我),可以考虑添加Swap弥补一下内存不足,土豪随意。现在新用户有送300美元试用金额,2个月后就要交钱了。有兴趣听我安利的请继续。

打造自己的Python编码环境

【前言】

趁着放假,重新配置了一下自己的Mac的编程环境,毕竟新年新气象嘛,主要是iTerm2、Zsh、Vim优化、Consolas字体、NoisyTyper,这些的相关配置。工欲利其事必先利其器,好的编码环境可以提升我们的打码的幸福感。好的编码环境包括美观(视觉),声音(听觉),流畅度(触觉),工作环境(嗅觉,味觉)等多个方面。后面有几张配置后的图片感受一下,主要看字体和配色(有些人可能觉得比较丑,个人喜欢黑紫,配色和字体有很多选择,各有所好,求别喷 XD)

Zsh效果
此处输入图片的描述

Vim效果
此处输入图片的描述

用redis实现有优先级的"celery"

【需求背景】

对于异步任务处理,相信很多人首选celery,的确,celery处理异步任务非常强悍,使用简单,支持各种并发。但是,大家来看看我所遇到的一个应用场景:每次后台上传一个游戏母包,然后对这个母包处理(添加某种标识,比如id)生成多个游戏子包,其中有一些id号的包是要求尽快的处理的,剩下的可以闲时处理。这里就对要把一个母包分成两个任务来处理,其中一个是优先处理的,另一个是闲时处理。

meinheld为何比gevent高效?

【前言】

两者都是高性能的WSGI兼容的web服务器。既然是同种东西,必然有对比,网上有挺多benchmark,我也做过对应的benchmark,不过没有整理,这里推荐一下网上的一篇benchmark,能够看出meinheld的性能确实好得令人意外。那么为什么meinheld会比gevent性能高这么多呢?我们从底层实现来看看,他究竟做了一些什么。

后缀数组小结

这篇文章看的人还是挺多的,为了提升大家的阅读快感,特地写了这markdown版。希望大家会喜欢。

【前言】

后缀数组号称字符串处理神器,不过发现好多人都只会用模板,其实这不是我们学算法的本质,我们学习算法的本质应该理解其实现原理,并加以实现,特别是算法,更讲究的是一种思想。一年前的我也是只会用别人的模板,最近却静下心来,研究了一下后缀数组,自己写了一份自己的模板。
我基本上是跟着连教的ppt来学习的,当然也少不了百度,先讲一下基本概念。(这里大量引用了连教的ppt)

Reactor

【Reactor】

Reactor设计模式在高性能I/O框架中随处可见,例如redis,tornado,gevent,libevent等。

Reactor可以翻译为反应器,是一种基于事件驱动的设计模式。那么它是如何运作的呢?其实很多设计模式都来源于生活中的一些常见的处理事情的方式。

我们先来看一个例子:你和妹子去购物中心吃饭,发现很多人在排队,这时只需要让前台在电脑上填上你需要的双人位,和你的手机号码,待会有位置的时候会发短信给你,这时候你可以陪妹子到处逛逛,买买买。当餐厅有双人位空出的时候,就会发短信或打电话给你,这时你就可以带妹子去吃饭了。

上面例子中,你没有呆呆的排队等餐厅有位,你还陪妹子去逛街买了很多东西,整个过程都是不阻塞的,效率非常之高。这里面餐厅充当了Reactor的作用,他帮你一直盯着,等有位置空出的时候,就做出相应的反应:根据你所填的手机号码,通知你可以就餐。

总结:在Reactor模式中,处理事件的程序不会去调用反应器,而是告诉Reactor监听一个事件,和这个事件发生时处理方法,当Reactor监测到这个事件发生时,就启动对应的处理方法(一般是回调函数)进行处理,这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你)。

I/O多路复用

【I/O多路复用技术】

系统内核缓冲I/O数据,当某个I/O准备好后,系统通知应用程序该I/O可读或可写,这样应用程序可以马上完成相应的I/O操作,而不需要等待系统完成相应I/O操作,从而应用程序不必因等待I/O操作而阻塞。

Linux 启动过程

安装了Arch,顺便梳理一下linux启动流程。

【BIOS(MBR)】

  1. 开机自检,通过通过BIOS加载CMOS,获取各种硬件信息。
  2. 按照BIOS 的boot sequeuece顺序读取每一个存储设备的最前面512个字节,如果发现最后两个字节是0x55, oxAA,那么就找到了主引导扇区MBR。
  3. MBR结构如下:

Arch

这里记录了一些Arch的小知识点。

【分区表】

MBR(master boot record):只能有4个主分区,一个拓展分区(也算一个主分区),拓展分区下可以建多个逻辑分区

GUID:只有主分区,数量不限

,