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

Thu 28 February 2019

Python 在 2019-02-25 释出了 3.8 早期预览版 3.8.0a2,其中新增了 multiprocessing.SharedMemory 用以支持共享内存,大大提高多进程之间通信效率。简单看了一下实现代码主要涉及如下 Python 模块

在 POSIX 平台下共享内存创建过程如下:

  1. 基于 tmpfs 打开或创建具名(文件名)的共享内存,得到文件描述符
  2. 通过 mmap 将文件描述符映射进程的内存地址空间
  3. 通过 memoryview 直接访问经过 mmap 映射后的的内存地址空间

锁的问题

memoryview 通过如下方式使用:

s = bytearray(b'aaa')
m = memoryview(s)
m[0] = 98
print(s)  # outputs: bytearray(b'baa')

当上面代码执行 m[0] = 98 时实际上调用的是 C 代码 memory_ass_sub,然后调用 PACK_SINGLE 通过 memcpy 覆盖指针原有的值。

所以直接操作 multiprocessing.SharedMemory 会产生数据竞争,不应该直接使用,应该使用 multiprocessing.Valuemultiprocessing.Array 这种更高层的抽象,锁在这一层级实现。

参见

更多关于共享内存参见:


Category: Python Tagged: Python 3.8 multiprocessing 共享 内存 shared memory

comments


译文:Go 内存分配器可视化指南

Sat 23 February 2019

当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂。一切看起来都像一个神秘的黑盒子。因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥离才能去理解它。

我们将通过这篇文章来一层层的剥离这些细节。如果你想学习所有关于 Go 内存分配器的知识,那么这篇文章正适合你。

物理内存和虚拟内存

每一个内存分配器都需要运行在由底层操作系统管理的虚拟内存空间(Virtual Memory Space)之上。

下图是一个物理内存单元(Physical Memory Cell)的简要说明(非精准)

A simple illustration of a Physical Memory Cell

一个内存单元的概述经过大大简化之后描述如下:

  1. 地址线(Address line)(晶体管做的开关)用于访问电容器(数据到数据线(Data Lines))。
  2. 如果地址线有电流流动(显式为红色),数据线可以写入到电容器,所以电容器带电,逻辑值表示 “1”。
  3. 如果地址线没有电流流动(显式为绿色),数据线不可以写入到电容器,所以电容器不带电,逻辑值表示 “0”
  4. 当 CPU …

Category: Go Tagged: Go memory allocator

comments

Read More

《敏捷革命》读书笔记

Fri 15 February 2019

基本过程

准备

  1. 挑选一位 产品负责人(Product Owner) :负责沟通客户并根据客户反馈规划待办事项
  2. 挑选 团队 :小而精,3 ~ 9 人
  3. 挑选 Scrum 主管(Scrum Master) :培训 Scrum 确保 Scrum 正确运用,消除团队障碍
  4. 确定 冲刺(Sprint) 周期,不要超过一个月,最好 1 ~ 2 周

执行

  1. 产品负责人拟定 待办事项 ,并确定优先级

  2. 让实际开发的团队评估和改进待办事项

  3. 通过 冲刺规划会 规划接下来一个冲刺要完成的待办事项,并将借助 看板 工具将工作透明化

    看板可分为如下几个项:

    1. To do -- 当前冲刺需要完成的任务
    2. In progress …

Category: 读书 Tagged: Scrum Agile 敏捷 阅读

comments

Read More

通过 acme.sh 获取 Let's Encrypt 免费证书

Tue 12 February 2019

配置 Nginx 正确处理 Webroot 验证

在证书签发过程中 Let's Encrypt 会验证你拥有当前域名,最基本的方式在你的网站根目录创建一个文件,并通过域名在外部进行请求,如能请求到则认为你拥有该网站的控制权。假设你有一个域名 example.com, 验证步骤大体如下:

  1. 通过工具在网站根目录下创建 .well-known/acme-challenge/some-random-letters
  2. 工具将创建的路径告知 Let's Encrypt
  3. Let's Encrypt 通过域名请求该文件,如 http://example.com/.well-known/acme-challenge/some-random-letters
  4. 若能请求到则确认拥有该网站的控制权颁发证书,否则拒绝颁发

为了简化多个域名颁发证书需指定不同的 Webroot,我们可以将所有域名的验证统一放在一个目录下,并新增一个配置片段供需要启用 HTTPS 的网站引用,新增 /etc/nginx/snippets/letsencrypt-acme-challenge.conf ,并填充如下内容

#############################################################################
# Configuration file …

Category: Linux Tagged: SSL HTTPS

comments

Read More

修改本地 Git 历史

Wed 21 November 2018

很早之前一篇发表在内部的文章,抽时间整理了一下发布出来。

以下操作会修改提交历史, 可能会造成一些不可恢复的问题, 不是 下面情况不要这么操作

  1. 基于 GitHub Fork -> Pull Request 流程仅针对 Fork 后的仓库进行操作
  2. 非第一种情况的前提是当前修改的提交还未提交到远端

操作下面命令前最好先备份

修改上一条提交的信息

有时候我们在用 Git 提交后发现提交信息(commit message)不是我们预期的内容(错别字或描述错误等), 这个时候我们可能想修改一下上一条提交的信息, 有两种方式可以进行:

$ git commit --amend

这条命令会直接打开你的终端编辑器让你可以修改提交信息, 也可以组合 reset 命令重新提交:

$ git reset HEAD^ --soft
$ git commit -m 'new message'

这条命令会撤销上一条提交, 并将上一条提交的内容放在工作区内(git add 之后的区域), 然后就可以通过 git commit …

Category: Git Tagged: Git

comments

Read More

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

Wed 21 November 2018

pyenv 是一个简单的 Python 版本管理, 可以安装对应版本的 Python 不依赖系统的包管理, 我用它来在生产和测试环境安装 Python 3.6.

它的基本原理是安装对应版本的 Python 在它自己的目录下, 然后将对应的 bin 目录通过插入 PATH 变量里实现.

安装可以参考官方文档, 但是用它部署 安装在 HOME 目录下会引起一些权限问题, 所以我将安装目录放在了 /srv/pyenv 下:

$ git clone https://github.com/pyenv/pyenv.git /srv/pyenv
$ echo 'export PYENV_ROOT="/srv/pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin …

Category: Python Tagged: Python 2to3

comments

Read More

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

Tue 20 November 2018

在 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 路径, 参考:

$ echo 'export PATH="/usr/local/opt/curl/bin …

Category: Python Tagged: pycurl macOS OSX

comments

Read More

从单一软件到处处实践 GTD

Sun 05 August 2018

这篇文章首发于我们团队内部。

刚开始接触 GTD 时我是找了一个软件来实践 GTD, 但是效果不是特别好,主要三点:

  1. 收集麻烦
  2. 需要单独的软件,我一般会为了节省资源尽量少开软件的的人,所以我对打开很多的软件会很不爽
  3. 最主要是懒

所以后来我就开始慢慢放弃收集,再也不打开那个软件。再接着我发现其实我们所用到的很多软件都帮我们已经实现了类似的机制。下面举几个我用来实践 GTD 的地方。

邮箱

大部分情况下如果别人让我做一件事我会让 Ta 给我发一封邮件,如果我没有完成邮件中的工作那这封邮件就会一直在收件箱里躺着, 直到我完成了对应的工作我就会选择将之归档或移动到特定的文件夹,所以我目前有上万封邮件但是收件箱里只有少数没有完成的邮件。

每天我打开邮件看到收件箱我就知道哪些还没有做。

禅道

我们内部使用禅道做项目管理和 Bug 跟踪,测试和产品会指派给我们一些 Bug 或需求,我们没有完成就会一直在我们名下。 但是有一点是需要注意的就是我们一旦完成(或者说接下来需要他人处理)那么就需要及时变更状态, 这样就可以推动别人来继续。

不要把不属于自己的部分放在自己名下。

GitLab

GitLab 右上角有一个 TODO 的通知,一般我没有完成的我是不会点击完成(Done)的。比如今天有一个发送周报的 Issue 提醒 …

Category: 效率 Tagged: GTD 高效

comments

Read More
Page 1 of 11

Next »

Fork me on GitHub