Python与多线程
python增量定义如下Python与多线程,python,multithreading,Python,Multithreading,python增量定义如下 #define Py_INCREF(op) ( \ _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ ((PyObject *)(op))->ob_refcnt++) 对于多核,增量仅为一级缓存,而不是刷新到内存 如果两个线程在不同的内核中同时递增refcnt,而不刷新实际内存,那么对我来说,可能会丢失一次递增。 -ob_refcnt=1 -Core 1增量
#define Py_INCREF(op) ( \
_Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \
((PyObject *)(op))->ob_refcnt++)
对于多核,增量仅为一级缓存,而不是刷新到内存
如果两个线程在不同的内核中同时递增refcnt,而不刷新实际内存,那么对我来说,可能会丢失一次递增。
-ob_refcnt=1
-Core 1增量,但不刷新=>Core 1的一级缓存中的ob_refcnt=2
-Core 2增量,但不刷新=>Core 2的一级缓存中的ob_refcnt=2
-WTF
使用多核或多进程是否存在风险
PyObject的声明如下:
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject
但Py_-ssize_t只是一个ssize_t或intptr_t
似乎没有使用_Py_atomic*函数和属性
Python如何管理这个场景?它如何在线程之间刷新缓存?Python的CPython实现已经完成。在不持有此锁的情况下调用绝大多数Python C API函数(包括
Py_incremf
)是一种未定义的行为,几乎肯定会导致数据不一致或程序崩溃
GIL可以是
由于需要持有此锁才能对Python对象进行操作,因此Python中的多线程处理非常有限,唯一能够很好地并行化的操作是等待IO或大型数组上的纯C计算。多处理
模块(启动独立的Python进程)是并行Python的另一个选项
已经有(删除/最小化对GIL的需求),但这些导致了单线程代码的显著减速,因此被放弃。为什么不使用Python的锁或信号量?
什么意义上的风险?Python如何管理这种情况?Python无法管理任何线程!因为所有线程都使用单独的pythonshell,所以只能
启动、停止、暂停
操作。数据地址在进程之间共享(不复制、移动,仅渲染阴影数据图像(快照))。如果要管理GIL,我想调用mfence来刷新所有增量。是吗?我不是100%确定。但我不知道他们是否是对的。。。