本站总访问量 PEP-703 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

PEP703中讲到的nogil

PEP703由nogil分支作者编写,其中描述了

  • biased reference counting(偏向引用计数),描述了引用计数的设计方式,该设计方式避免同一线程原子化对饮用计数的读写

    • 本地引用计数(“local” reference count):本线程所拥有的引用计数

    • 共享引用计数(“shared” reference count):其他线程使用原子化来访问该引用计数

    • interned string,小整数,静态分配的Python对象,True,False和None对象的本地引用计数将被置为-1,线程ID将被置为unsigned equivalent(UINTPTR_MAX),保证这些对象不会被回收,一个比较常见的设计。

1
2
3
4
5
6
7
struct _object {
_PyObject_HEAD_EXTRA
uintptr_t ob_tid;
Py_ssize_t ob_ref_local;
Py_ssize_t ob_ref_shared;
PyTypeObject *ob_type;
};

描述了PyObject的对象。

  • 内存分配:Python使用pymalloc,需要在gil锁之下保证线程安全;作者建议使用性能良好的线程安全分配器mimalloc。

  • 禁用free list

  • 使用stop-the-world保证线程安全

  • 消除分代垃圾回收使用非分代垃圾回收

  • 延迟引用计数和偏向引用计数集成

  • 对列表,字典集合等对象的修改必须持有锁

评论