Python GIL 算法说明
本文用代码说话,说明了 GIL 是怎么运行在 Python 解释器中的。简单来说,解释器做了这么几件事情:
bytecode = compile(function)
while True:
drop_GIL
take_GIL
execute_opcode(bytecode.next_intruction())
如果你在写多线程应用,那么这个 GIL 会把所有其他的线程都 hang 住,不执行 execute_opcode。即:任一时刻,不管有多少线程,Python 总是只有一个 thread 执行 opcodes,其他的就傻等着。
几个核心概念:
- GIL: 它是一个布尔值(锁)
- GIL 的修改有 gil_mutex 控制访问,有 gil_cond 控制修改。
Docker-app - 管理 docker-compose YAML 依赖的工具
docker-app 是最近刚推出来的工具,他要解决的问题是 docker-compose.yaml 有一些东西是可以复用的,但目前还是只能 copy & paste. 举个例子,下面会是很常见的场景:
$ docker-app render | docker-compose -f - up
或者
$ docker-app render --set version=0.2.3 --set port=4567 --set text="hello production" | docker-compose -f - up
它也可以和 helm 结合起来用,不过看起来很水。
衍生思考:YAML 真讨厌。
read moreC10K 问题
一篇出名的老文章&好文章,涵盖了现代 Web Server 设计的基础理论,设计目标是写出一个能支持 10k 个连接的服务器软件。
五种常见的 I/O 策略:
- 多线程,每个线程使用 nonblocking I/O 和
select()
/poll()
这类 level-triggered readiness notification 接口处理 data waiting。 - 多线程,每个线程使用 nonblocking I/O 和 edge-triggered readiness notification,这类接口包括
kqueue()
,epoll()
, realtime signal, etc. - 使用 asynchronous I/O
- 每个线程对应一个 client …
XML 的安全漏洞
本文是 Python XML 的文档,这个章节描述了 Python 内置的 XML 处理模块无法抵抗精心构造过的恶意数据。
攻击者可以通过滥用 XML 的特性达到 Dos,越权访问本地文件,远程连接到别的机器,或者绕开防火墙。
几种常见的攻击:
- billion laughs / exponential entity expansion: 多级嵌套的 entity 其中的每一级都引用别的级很多次,所以 xml 本身自由一丢丢,但是扩展开以后会指数增长,知道内存撑爆
- quadratic blowup entity expansion: 同上,也撑爆内存,不过是通过一遍又一遍地扩展千余个字符,虽然效率比上面低,但是可以绕过解析器深度嵌套的防御。
- external entity expansion: 因为 XML 中可以饮用 local / remote 文件,所以攻击者可以塞入一些本地或者远程的有害 …
Python 安全漏洞若干注意要点
本文介绍了 Python 编程需要注意的会产生安全漏洞的写法。
- 注入:不能直接拼接字符串然后提交到别的系统运行,所有的字符串都要 escape 过一次,可以的话,使用现成的库,例如 shlex,ORM
- billion laughs 攻击: 解析来自不信任来源的 XML 文件,可能会因为这种攻击类型导致内存上 G 最后进程崩溃。
- external entity expansion: XML 可以引用别的 xml,这会导致库会默默地发起网络调用。使用 defusedxml 替代 Python 标准库的 xml
- assert 语句会在
__debug__ = False
时失效。要么只用在 unitest,要么(我觉得)可以自己写一个yourproject.utils.asserts.ok …