【译】Python 幕后 #1: CPython 虚拟机如何工作

原文链接:Python behind the scenes #1: how the CPython VM works。 介绍(Introduction) 你是否曾经好奇过当你运行 Python 代码时 python 做了些什么? $ python script.py 这篇文章将开启一个系列来尝试解答这个问题。我们将深入 Python 最流行的实现 CPython 的内部。 通过深入 CPython 的内部我们将更深一层的去理解这门编程语言本身。这也是我们这个系列的最主要的目标。...

comments

Python 3.8 新增 multiprocessing.SharedMemory 支持共享内存

Python 在 2019-02-25 释出了 3.8 早期预览版 3.8.0a2,其中新增了 multiprocessing.SharedMemory 用以支持共享内存,大大提高多进程之间通信效率。简单看了一下实现代码主要涉及如下 Python 模块 内置类型 memoryview mmap 在 POSIX 平台下共享内存创建过程如下: 基于 tmpfs 打开或创建具名(文件名)的共享内存,得到文件描述符 通过 mmap 将文件描述符映射进程的内存地址空间 通过 memoryview...

comments

通过 pyenv 在生产环境安装 Python 3

pyenv 是一个简单的 Python 版本管理, 可以安装对应版本的 Python 不依赖系统的包管理, 我用它来在生产和测试环境安装 Python 3.6. 它的基本原理是安装对应版本的 Python 在它自己的目录下, 然后将对应的 bin 目录通过插入 PATH 变量里实现. 安装可以参考官方文档, 但是用它部署 安装在 HOME 目录下会引起一些权限问题, 所以我将安装目录放在了 /srv/pyenv 下: $ git clone...

comments

解决 macOS 下安装 pycurl 后导入错误

在 macOS 下安装 PycURL 后 import curl 会提示: ImportError: pycurl: libcurl link-time version (7.43.0) is older than compile-time version (7.49.1) 这是因为系统中的 curl 版本过老导致, 可以通过使用 Homebrew 安装最新版来解决: $ brew install curl 安装完成后会提示一些信息, 按照提示的信息将 curl 加入到 PATH 路径,...

comments

迁移到 Python 3

前段时间(2017-06-07)我开始决定将公司现有的项目逐渐的迁移到 Python 3. 主要原因有一下几点: Python 3.6 新增了一些新的特性我很喜欢 包括: PEP484 类型注解 PEP492 原生的协程异步: async and await PEP498 格式化字符串 Python 3 的生态已经完善, 我们所使用的一些第三方库都已支持 Python 3(或有其他成熟的替代) Python 2 到 2020 年就不在维护 促成我决定迁移到 Python 3...

comments

Python github 私有项目通过 buildbot 进行 Review

背景 随着公司开发团队的壮大, 团队中每个人的水平参差不齐, 为了保证项目质量我们打算对 提交的代码进行 review, 但是苦于一直没有好的 review 机制. 前段时间我在逛 Rust 社区是发现了他们有一个 review 机器人 Homu 非常不错, 研究一下后我将其应用到我们当前 Python 项目中来配合 review, 我感觉非常棒, 今天抽空就分享给大家. 技术栈 本文涉及的项目和技术有: Homu buildbot git-pylint-commit-hook...

comments

Python mock 使用心得

好久没有更新博客, 趁着清明节小长假和我儿子正在睡觉更新一篇刷刷存在感. 近来变化很多, 儿子也有了, 工作上也有很多收获. 这篇博客就分享一下关于 mock 的使用的心得体会. 很长一段时间以来写单元测试都类似写执行脚本, 运行一下然后看一下结果. 这里面有一部分原因是因为无法规避外部的依赖组件, 比如: 数据库操作 外部接口调用 外部其他不可控因素 这样写测试只关心当前测试的结果, 而不去管其他测试是否 passed. 后面随着团队开始进新人, 由于团队里每个人的标准和水平不同,...

comments

Python 内存泄露实战分析

引子 之前一直盲目的认为 Python 不会存在内存泄露, 但是眼看着上线的项目随着运行时间的增长 而越来越大的内存占用, 我意识到我写的程序在发生内存泄露, 之前 debug 过 logging 模块导致的内存泄露. 目前看来, 还有别的地方引起的内存泄露. 经过一天的奋战, 终于找到了内存泄露的地方, 目前项目 跑了很长时间, 在业务量较小的时候内存还是能回到刚启动的时候的内存占用. 什么情况下不用这么麻烦 如果你的程序只是跑一下就退出大可不必大费周章的去查找是否有内存泄露, 因为...

comments

logging 模块误用导致的内存泄露

首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging 模块用的不对 我们之前有这么一个需求, 就是针对每一个连接日志输出当前连接的信息, 所以每一个 连接就创建了一个日志实例, 并分配一个 Formatter, 创建日志实例为了区分其他连接 所以我就简单粗暴的用了当前对象的 id 来作为日志名称: import logging class...

comments