Shawn's Blog

一个伪程序员的伪技术博客

0X00 Python3的super

Python中对象的概念都快被大家淡忘了,因为一切都是对象(话虽然这么说,但是怎么可能淡忘对象呢)。看下面一段Python2的代码,Python2中麻烦的就是这个super()的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Human:
def __init__(self):
self.name = 'human'
print 'hello, i im', self.name


class Student(Human):
def __init__(self):
super(Student, self).__init__()
self.name = 'student'
print 'hello, i im', self.name


a = Student()

在初学Python的时候,如果是Python2很大可能会在super(Student, self).__init__()这段迷惑好一阵子,不过好在Python2马上就要凉透了,在Python3中可以将代码改写成如下方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Human:    # 不用强行继承自object了
def __init__(self):
self.name = 'human'
print('hello, i im', self.name)


class Student(Human):
def __init__(self):
super().__init__() # super的用法也更明了
self.name = 'student'
print('hello, i im', self.name)


a = Student()

其中super的用法由super(Student, self).__init__()改成了super().__init__(),看起来清晰多了,在使用Python3后不建议以任何理由使用老式Python中的super调用。

阅读全文 »

0X00 使用docker部署的优势

在使用docker部署之前,一般都是直接将MySQL和Redis这类服务直接安装在机器上的。以至于好多新手才开始安装使用的时候经常会出问题,出了问题解决不了就重装系统然后再重装软件,而且如果想同时用MySQL5和MySQL8就非常麻烦了。话说回来,在生产环境服务器上其实还是很多直装的服务的,不过其实使用docker部署一套相同的环境是非常有利于自己本地开发的。

我个人看来使用docker部署的优势有这几点比较明显的:

  1. 很容易做到开发环境、测试环境和生产环境的“环境与版本”大统一;
  2. 很容易在开发环境本地同时部署多套不同版本的同一服务;(比如你负责8个项目,这8个项目要用8个不同版本的MySQL)
  3. 能很快部署一套开发环境;(事实证明在一台网络环境好的机器上,能在5分钟内部署一套数据库)
  4. 整理好配置文件后可以很容易备份整套配置;
  5. 安全问题,在物理机上直接装了MySQL,如果部署不够仔细的话有数据库被攻破后危及服务器的风险,而Docker部署的由于容器所在就不会有这种问题;
阅读全文 »

0X00 线程池和进程池

多线程和多进程在平时编程中是挺常见的操作,不过控制进程和线程的数量是一件比较麻烦的事情。尤其是线程,之前在搜索到的关于线程池的内容多数都是“造轮子”,实际上Python已经给我们造好了这个轮子。文档在这里,甚至还是中文的https://docs.python.org/zh-cn/3.7/library/concurrent.futures.html#module-concurrent.futures

我这里简单的整理了一下,做个小样例展示出来方便查阅。这里就假装大家对Python有一定的了解,而且也对操作系统中的线程和进程有一些了解了。(哦对了,还需要了解一下GIL才行)

阅读全文 »

0X00 前言

实话讲,Django的信号(signal)机制其实用到的时候并不多,但是某些特定场景下一个信号能解决非常大的问题,所以信号这个东西还是值得了解一下的。那么为什么这里只说一些初级内容呢,主要是因为通过调查发现信号的高级知识用(我)的(也)很(不)少(会)。

目前我工作中用到的信号机制也比较少,所以可能有些事情说不到点上还请见谅。那我们开始吧~

0X01 什么是信号

“信号机制”光从名字上来就大概能懂了。应该就是:某人发出某信号,某人接受到之后做一些事情。所以看起来非常类似我们熟悉的“订阅-发布”模式,实际上也也确实很类似。整个信号机制分成这么几个部分:发布者、信号、接收者和一个函数。

我们传统战场上的一个行为来类比会比较好解释

  1. 发送者:类似于战场上打信号弹的人
  2. 信号:信号弹(信号弹会分成几种比如红色、蓝色、绿色的)
  3. 接受者:各个不同阵地都有人观察着战场的信号弹
  4. 一个函数:接受者看到信号弹后会对应作出战术动作

比如我们有三个人:小明、小强和李铁蛋,每人又有三种信号弹:红色、蓝色和绿色,又有三个不同阵地:路口、广场和理发店。其中每个人的信号弹不同,小明的红色信号弹打出去是一个”明“字,小强的是”强“,李铁蛋的是个”蛋“。

那么这个时候场上的小明发射了蓝色的信号弹(发送者发送了特定信号),三个阵地的人都看到了,但是之前首长说只有广场的阵地要响应小明的蓝色信号弹(提前固定好接受者要接收哪部分信号),广场的阵地接受到信号之后按照之前的计划前去攻打碉堡(接受者收到指定信号后执行一个函数)。

大概的流程是这个样子的,中间可能有些不准确不过大体是对的,下面我们来看一下Django自身内置的一些信号。

阅读全文 »

0X00 IO总是比运算慢

众所周知计算机的IO都要比计算慢很多很多,即时是目前民用的高级SSD:三星970PRO,它的读写速度都要比内存慢上几个数量级,更不要说CPU了。所以软件的IO通常都是瓶颈,很多时候都是CPU等内存,内存等磁盘,磁盘等网络。

那么如何才能提升自己web服务的响应速度呢?通常来说简单的操作有如下两种:换硬盘或者改SQL。

0X01 换硬盘

“这难道不是废话吗?”对呀,这就是废话。当瓶颈出现在数据库的查询上了,那么把正在用的机械硬盘换成固态硬盘当然会提升效率,稍微想想就呢能明白的事情。事实上也是这样的,之前我把同样量级的数据从我们的测试环境搞到我本地,测试环境是企业级HDD,而我本地是三星970EVOPlus的SSD,会发现查询同一个内容就快了好多好多。

那其实这个换硬盘并不是好办法,毕竟不能指望全都用上SSD。而且即使用上SSD了,在查询更复杂或者数据量更多的情况下还是会出现瓶颈。那首先想到的方式就是优化SQL了。

阅读全文 »
0%