03 2020 档案
摘要:楔子 我们之前谈到的「零拷贝」是通过减少上下文切换的次数,提升文件传输的性能,而事实上「高并发服务」也是通过降低切换成本实现的,下面来看看它是如何做到的。 如果你需要访问多个服务来完成一个请求的处理,比如实现文件上传功能时,首先访问 Redis 缓存,验证用户是否登陆,再接收 HTTP 消息中的 b
阅读全文
摘要:楔子 本文来自于公众号《小林coding》 磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 N 多倍,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,也可以有效地减少磁盘的访问次数。 这
阅读全文
摘要:楔子 本文来自于韩建老师的《分布式协议与算法实战》 不知道你在工作中有没有遇到这样的事儿:你开发实现了一套 AP 型的分布式系统,实现了最终一致性。业务也接入了,运行正常,一起看起来都那么美好。可是,突然有同事说,我们要拉这几个业务的数据做实时分析,希望数据写入成功后,就能立即读取到新数据,也就是要
阅读全文
摘要:楔子 本文来自于韩建老师的《分布式协议与算法实战》 有一部分人的业务在可用性上比较敏感,比如监控主机和业务运行的告警系统。这个时候,相信你希望自己的系统在极端情况下(比如集群中只有一个节点在运行)也能运行。像二阶段提交协议和 Raft 算法,它们都需要全部节点或者大多数节点正常运行,才能稳定运行,那
阅读全文
摘要:楔子 假如我们通过 Raft 算法实现了 KV 存储,虽然领导者模型简化了算法实现和共识协商,但写请求只能限制在领导者节点上处理,导致了集群的写入性能约等于单机。那么随着业务发展,集群的性能可能就扛不住了,会造成系统过载和服务不可用,这时该怎么办呢? 其实这是一个非常常见的问题。在我看来,这时我们就
阅读全文
摘要:如何选举领导者? 本文来自于韩建老师的《分布式协议与算法实战》 在了解完 Paxos 算法之后,我们来看一看 Raft 算法。Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候
阅读全文
摘要:楔子 提到分布式算法,就不得不提 Paxos 算法,在过去几十年里,它基本上是分布式共识的代名词,因为当前最常用的一批共识算法都是基于它改进的,比如 Fast Paxos 算法、Cheap Paxos 算法、Raft 算法、ZAB 协议等等。而很多小伙伴都会在准确和系统理解 Paxos 算法上踩坑,
阅读全文
摘要:楔子 很多人可能都有这样的感觉,每次要开发分布式系统的时候,就会遇到一个非常棘手的问题,那就是如何根据业务特点,为系统设计合适的分区容错一致性模型,以实现集群能力。这个问题棘手在当发生分区错误时,应该如何保障系统稳定运行,不影响业务。 这个时候我们需要使用 CAP 理论,你可能会问了:为什么 CAP
阅读全文
摘要:楔子 在学习到分布式理论的时候,总是会讨论到拜占庭将军问题,很多人觉得难理解。其实,拜占庭将军问题(The Byzantine Generals Problem),它其实是借拜占庭将军的故事展现了分布式共识问题,还探讨和论证了解决的办法。而大多数人觉得它难理解,除了因为分布式共识问题比较复杂之外,还
阅读全文
摘要:楔子 Python 有一个第三方模块:psutil,专门用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等等。 首先我们要安装,直接 pip install psutil 即可,安装之后来看看它的用法。 CPU 相关 获取 CPU 的逻辑核心数量 import psutil pri
阅读全文
摘要:楔子 相信在使用 pandas 的时候都遇到过如下情况,当我们打印一个列数或行数比较多的 DataFrame 时,该 DataFrame 不会全部显示,中间一部分会用省略号代替,举个栗子: 由于行数比较多,默认情况下不会全部显示,而是只显示一部分;至于列也是同理,只不过我们这里的列不多,因此全部显示
阅读全文
摘要:pyfiglet 是一个专门用来生成艺术字的模块,只支持英文。 from pyfiglet import Figlet f = Figlet() print(f.renderText("hanser")) """ _ | |__ __ _ _ __ ___ ___ _ __ | '_ \ / _`
阅读全文
摘要:xpinyin 可以用来将汉字转换成拼音。 from xpinyin import Pinyin # 实例化Pinyin这个类 p = Pinyin() # 传入汉字,直接返回拼音 print(p.get_pinyin("古明地觉")) # gu-ming-di-jue # 默认拼音之间是以"-"进
阅读全文
摘要:我们以前想生成随机字符串的时候,会使用 uuid,比如: import uuid print(uuid.uuid4()) # 56981b16-0dde-477e-9f07-e46a76d01d2c 但是这个生成的 uuid 太长了,于是便有了 shortuuid。 import shortuuid
阅读全文
摘要:楔子 记得 MySQL 吗?如果在 MySQL 命令行查询的话,会以如下的形式进行展示。 同理,prettytable 就是用来将数据按照上述形式进行输出的,我们来看一下用法。 添加表头、添加行、添加列 类似于数据库中的表,有表头、或者说字段名,以及每一行的内容。 from prettytable
阅读全文
摘要:fuzzywuzzy 是用来计算两个字符串之间的相似度的,它是依据Levenshtein Distance算法来进行计算的。 Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字
阅读全文
摘要:楔子 context 是 Go 在 1.7 版本的时候引入的标准库,从名字也知道是和 "上下文" 相关,不过准确的说应该是 goroutine 的上下文,它包含了 goroutine 的运行状态、环境等信息。context 主要是用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时
阅读全文
摘要:楔子 使用pandas做数据处理的第一步就是读取数据,数据源可以来自于各种地方,csv文件便是其中之一。而读取csv文件,pandas也提供了非常强力的支持,参数有四五十个。这些参数中,有的很容易被忽略,但是在实际工作中却用处很大。比如: 文件读取时设置某些列为时间类型 导入文件, 含有重复列 过滤
阅读全文
摘要:楔子 下面我们来进行高级图表的绘制,说是高级图表,其实也不算高级,主要是一些子图的绘制。以下代码在 jupyter notebook 上运行,先导入几个模块: import datetime import plotly.graph_objs as go import numpy as np impo
阅读全文
摘要:楔子 不管数据分析,数据挖掘,机器学习等,都会经常遇到数组的 reshape 操作。那么你有没有想过,为什么一个一维数组,能 reshape 成任意维度的高维数组呢。 NumPy 也提供高效的数据 reshape 操作,那么它是如何实现这种操作,用到什么数据结构,原理又是什么? 弄明白这个问题后,再
阅读全文
摘要:楔子 Python 在数据可视化方面有非常多的第三方库,比如 matplotlib、pyecharts、bokeh 等等,但个人最喜欢的莫过于 plotly 这个库。plotly 被称为数据可视化神器,首先它支持很多很多种图表,并且参数可以自由设置,最关键的是画出来的图非常漂亮。毕竟在数据可视化方面
阅读全文
摘要:我们之前学习了基础的数据分组汇总操作,现在,让我们讨论一些更高级的分组统计分析功能,也就是 GROUP BY 子句的扩展选项。 销售示例数据: 本节我们使用新的数据集,表名叫做sales_data,它包含了 2019 年 1 月 1 日到 2019 年 6 月 30 日三种产品在三个渠道的销售情况。
阅读全文
摘要:楔子 将python中嵌套的列表扁平化,指的就是: lst = [1, [[[[3, 3], 5]]], [[[[[[[[[[[[[6]]]]], 8]]], "aaa"]]]], 250]] # 类似于上面的列表,我们要得到下面的结果 [1, 3, 3, 5, 6, 8, "aaa", 250]
阅读全文
摘要:楔子 Go 是一个自带垃圾回收的编程语言,采用三色标记算法标记对象并回收,和其它没有自动垃圾回收的编程语言不同,使用 Go 语言创建对象的时候,我们没有回收 / 释放的心理负担,想用就用,想创建就创建。 但如果你想使用 Go 开发一个高性能的应用程序的话,就必须考虑垃圾回收给性能带来的影响,毕竟 G
阅读全文
摘要:楔子 有些时候,我们需要得到一个对象的某些属性,我们最常用的就是通过type来查看该对象的类型,或者使用dir来查看该对象具有哪些属性。但是python提供了一个非常好的模块: ,来帮助我们更好地获取对象的属性,下面就来看看该模块支持哪些方法。 检测对象的种类 这里指的是种类,不是类型。 判断对象是
阅读全文
摘要:楔子 WaitGroup 是用来做任务编排的一个并发原语,它解决的是 "并发 - 等待" 的问题。比如我们要完成一个大的任务,需要使用并行的 goroutine 执行三个小任务,只有这三个小任务都完成,我们才能去执行后面的任务。 这个时候使用使用 WaitGroup 就非常合适了,而且名字也很形象:
阅读全文
摘要:楔子 现在图像识别、语音识别之类的项目越来越火,通过机器学习训练出一套模型,再将图像、音频之类的上传上去,就可以识别图像上的内容、将音频转成文字等等。 但有的我们训练的模型可能不够完善,对格式限制的比较死,比如图片只接收 png 格式,音频只接收 mp3 格式等等。这个时候我们就需要判断用户的上传的
阅读全文
摘要:什么是HDF5 HDF5: Hierarchical Data Format Version 5 ,对于存储大规模、具有相同类型的数据,HDF5是一种非常不错的存储格式,文件后缀名为h5。这种格式的文件的存储和读取速度非常快,并且我们可以把HDF5文件看成是一个"目录",它是分层次的,我们来看看如何
阅读全文
摘要:groupby ~~~python import pandas as pd df = pd.DataFrame({ "a": ['a', 'b', 'a', 'a', 'b'], "b": [1, 2, 3, 2, 1], "c": [3, 1, 5, 1, 7], "d": ["我", "是",
阅读全文