Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python与多线程_Python_Multithreading - Fatal编程技术网

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增量

python增量定义如下

#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%确定。但我不知道他们是否是对的。。。