HiKariのTechLab

光の技术屋


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 搜索

【Medium Python】第三话:python多线程为什么不能并行?

发表于 2021-10-30 | 更新于 2024-04-07 | 分类于 Medium Python

python的多线程,这是个老生常谈的话题了,网上资料也一大把。python默认的threading模块对多线程提供了支持,但实际多个threading.Thread实例无法并行运行(不是无法并发哦!)。
​
一句话概括答案:python的线程实质是操作系统原生的线程,而每个线程要执行python代码的话,需要获得对应代码解释器的锁GIL。一般我们运行python程序都只有一个解释器,这样不同线程需要获得同一个锁才能执行各自的代码,互斥了,于是代码就不能同时运行了。
​
好的,接下来我们细细讲解这句话背后的故事:

多线程并行测试

首先我们通过一些代码来测试多线程是否真的并行:

阅读全文 »

【Medium Python】第二话:dict的keys()返回了什么数据类型?

发表于 2021-10-23 | 更新于 2024-04-07 | 分类于 Medium Python

在python3里面,我们经常会用if k in d.keys()来判断某个key是不是在某个dict里面,或者是用a_dict.keys() - b_dict.keys()来获取两个字典之间keys的差集。那么这里就有一个问题,dict的keys()返回了什么数据类型呢?

list?set?两者都是错误答案。Don’t say so much,打印一下type,发现是这么个数据类型:<class 'dict_keys'>

dict_keys是什么东西?

在python dict数据结构定义中(dictobject.c),可以看到dict_keys的定义

阅读全文 »

【极客日常】一种解决redis源码编译时jemalloc报No such file or directory错误的方法

发表于 2021-10-19 | 更新于 2024-04-07 | 分类于 极客日常

在用源码编译redis的过程中,可能会报jemalloc出错,提示No such file or directory的问题,导致构建不能继续。一种常见的,在网上流传的方法是调整MALLOC参数为libc,但这并不是唯一解,不能一概而论。

以笔者的例子,笔者采用windows装CLion并用Remote Development连接linux虚拟机的方式来编译redis源码,版本为6.2.6,在构建的过程中也报了jemalloc出No such file or directory的问题。在笔者的场景下,仔细查看日志,会出现许多Permission Denied的字样,这说明有许多脚本没有执行权限。经过一番研究,执行下面俩操作之后,distclean一下,就能成功再次编译redis。

  • 在src目录下,chmod +x ./mkreleasehdr.sh,增加这个脚本的执行权限
  • 在deps目录下,chmod -R 777 jemalloc,把jemalloc目录下所有文件权限都提上来

暂时研究到的是这些,如果真是因为权限问题,且还有漏网之鱼的话,极端一点可以把整个redis源码目录权限都提上来。反正都可以试试看。

【Medium Python】第一话:为什么list“可变”,而tuple“不可变”?

发表于 2021-10-17 | 更新于 2024-04-07 | 分类于 Medium Python

前言

python面试有一道很基础的问题:list(列表)和tuple(元组)有什么不同?基本上只要背过题库的同学都知道,list(里面的元素)是可变的,tuple(里面的元素)是不可变的。

我们尝试在python解释器中改变tuple的元素(赋另一个值),会有以下的表现:

1
2
3
4
5
6
7
8
9
10
11
12
def tuple_check():
tp = ('123', 123)
tp[1] = 13

"""
Traceback (most recent call last):
File "H:/Projects/Python/playground/main.py", line 20, in <module>
tuple_check()
File "H:/Projects/Python/playground/main.py", line 10, in tuple_check
tp[2] = 13
TypeError: 'tuple' object does not support item assignment
"""

可以看到赋值操作报错,tuple不支持再次赋值,体现了其“不可变”的特性。

但是,不支持赋值/不可变的原因,到底是什么呢?不是说不支持就不支持吧!难道也没有支持的可能?

这个问题要给出清晰的答案可并不容易,如果你直接检索网上资料的话,会发现很多文章都在说重复的话,没有什么深入的挖掘,导致这个问题无从解释。于是,今天这篇文章,就给大家把这个问题讲的干脆一点。

以及,看完这篇文章之后,网上那些车轱辘话大家也就没有必要再看了。

阅读全文 »

【Medium Python】前言

发表于 2021-10-10 | 更新于 2024-04-07 | 分类于 Medium Python

python作为最流行的语言之一,我们对python的认知到底有多少呢?大胆猜测,95%的同学对python的了解都不超过5%吧!不用说python的c源码了,就算是python每个标准库的.py源码,都有很少人去关心。结论就是,我们对python本身的理解是远远不够的,比想象中还不够!当然,这也可能是python的语言特性导致的吧,在设计方面就不需要我们去多想。

python的岗位众多,网上的教材跟面试题也很多,然而很多都是八股文,浅尝辄止,鲜有深度的挖掘,让人知其然而不知其所以然,处处透露着对技术的不敬!想想看,游戏程序员学lua,一些C Library的实现、Lua底层机理都需要熟悉,python比lua应用会更加广泛,为什么就不可以去熟悉类似的东西呢?python的应用场景那么多,不去深入了解这门语言的实现,怎么能够更好掌控这门语言?怎么可能做出更加优秀的产品?

因此笔者决定,从一些所谓的python面试题出发,通过源码分析的方法,挖掘其思路与实现,让更多人对python有更加深入的了解。这个系列,会把一些本该属于python教程里的东西给展现出来,取名就叫做Medium Python——因为笔者刚出道(谈恋爱)时,已经写过Easy Python,里面罗列了些python的简单知识。至于未来有没有Hard Python,到时候再说吧!

Contents

  • 【Medium Python】第一话:为什么list“可变”,而tuple“不可变”?
  • 【Medium Python】第二话:dict的keys()返回了什么数据类型?
  • 【Medium Python】第三话:python多线程为什么不能并行?
  • 【Medium Python】第四话:类属性和实例属性是怎样的关系?
  • 【Medium Python】最终话:如何彻底理解with关键字的用法?

【Python随笔】如何访问类实例里带双下划线的属性

发表于 2021-10-06 | 更新于 2024-11-03 | 分类于 Python随笔

学过python的我们都知道在python的类实例instance的__init__函数里,可以初始化这个instance的属性。属性的命名有许多种,比如有一个例子:

1
2
3
4
5
class Student:
def __init__(self, name, gender, age):
self.name = name
self._gender = gender
self.__age = age

这三种属性名分别是:不带下划线、带一个下划线、带两个下划线

假设有一个类Student的实例student,我们通过访问student.name、student._gender,是能够获得对应属性值的,但访问student.__age却报了如下错误:

阅读全文 »

【Python随笔】用C++编写Python的扩展模块

发表于 2021-10-05 | 更新于 2024-04-07 | 分类于 Python随笔

近期笔者在研究python内部部分模块的实现机理,研究着研究着就开始硬刚C源码了。想着先前工作或是日常也没有体验过用C++编写python库,于是就刚好学习了一下。

用C或者C++编写python的扩展库,建议用Visual Studio宇宙第一IDE,一来能够同时支持python跟C,二来调试功能非常强大。入门上手的话,可以参考下面的文档:

  • 官网文档:扩展和嵌入 Python 解释器
  • VS文档:Create a C++ extension for Python

编写的库叫做cplayground,只包含一个hack函数tuple_setitem——强行设置tuple的元素(python默认是不支持的)。我们可以来看这样的python扩展用C++该如何实现:

阅读全文 »

【测试人生】《测试架构师修炼之道》阅读笔记

发表于 2021-10-04 | 更新于 2024-04-07 | 分类于 测试人生

《测试架构师修炼之道》一书,笔者入行一年多的时候拜读过。虽然这本书主要偏向业务测试、质量管理的方向,而并非技术测试、测试开发的方向,但只要是测试行业从业者,笔者认为都值得一看。

从笔者本人角度,对于测试人员的职业发展,是极端推崇技术方向的。但工作最终总会落实到人,近年来测试被划分为偏向技术的岗位,那么技术本身就一定要搞起来,这样才能使得这类职业能够在工作框架体系里处于不屈之地。

但即便如此,测试本身也有很多技术/管理方法论的积淀,有很多old school的东西是值得尊重的。不论技术做成什么样,从测试工作的最终目标而言,都需要贴合传统测试遗留下来的的概念。《测试架构师修炼之道》一书,对传统测试,尤其质量管理方向相关的知识点、工作目标、工作方法都概括的非常明确,是测试行业不可多得的智慧积淀(嗯,测试行业确实缺乏沉淀!)。

技术方向的测试同学阅读这本书,能够更好地把握技术研发的方向;业务方向的测试同学阅读这本书,能够更全面地规划自己的发展。

在阅读的过程中,笔者也做了相关的读书笔记,提炼了其中的精要。本文也将把笔者的读书笔记全部分享出来:

阅读全文 »

【极客日常】理解javascript/python中reduce操作的含义

发表于 2021-10-01 | 更新于 2024-04-07 | 分类于 极客日常

在学习javascript和python的过程中,我们通常会接触到map、filter、reduce之类的一等公民高阶函数。理解map和filter是相对简单的事情,但理解reduce的话还是需要一番推敲。正值十一假期,今天这篇文章就好好讲讲reduce这个东西

我们首先以python为例,看一段reduce程序的操作:

阅读全文 »

【极客日常】在Vue用echarts画带不同颜色点的散点图

发表于 2021-09-16 | 更新于 2024-04-07 | 分类于 极客日常

在vue技术栈下做图表需求,echarts是一个非常棒的选择,提供了非常多种多样的图标示例以及非常复杂强大的API。由于笔者近期工作内容中需要分析采样点的分布情况,因此自然而然接触到了echarts的3D散点图。在笔者的需求中,需要对不同点进行分类,并按特定的颜色显示出来。经过一番踩坑,了解到了echarts在实现这方面的机制。

echarts绘图/刷新只需要通过setOption接口即可实现。在各种options中,visualMap视觉映射组件能够根据数据在特定维度上的值,指定对应点的视觉属性(比如颜色、透明度、图元大小等等)。

要用到visualMap特性,需要import相关组件:

阅读全文 »
1…101112…19
ひかり.HDQ

ひかり.HDQ

talk is cheap, code is rich
189 日志
14 分类
417 标签
GitHub Mail CSDN Juejin Steam Bilibili
© 2019 – 2025 ひかり.HDQ
|