首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局解释器锁和数据访问(例如。(对于NumPy数组)

全局解释器锁和数据访问(例如。(对于NumPy数组)
EN

Stack Overflow用户
提问于 2012-01-11 18:36:25
回答 1查看 2.6K关注 0票数 7

我正在为Python编写一个C扩展,它应该在处理数据时释放Global解释器Lock。我想我已经很好地理解了GIL的机制,但是还有一个问题:当线程不拥有GIL时,我能在Python对象中访问数据吗?例如,我想从C函数中的(大) NumPy数组中读取数据,同时我仍然希望允许其他线程在其他CPU核上执行其他事情。C函数应该

Py_BEGIN_ALLOW_THREADS

  • read发布
  • ,无需使用函数来处理数据,甚至可以将数据写入以前构建的带有Py_END_ALLOW_THREADS的GIL

这安全吗?当然,其他线程不应该更改C函数使用的变量。但是,可能有一个隐藏的错误来源: Python解释器是否可以移动一个对象,例如。通过某种类型的垃圾收集,而C函数在一个单独的线程中工作?

为了用最小的例子来说明这个问题,请考虑下面的(最小但完整的)代码。(在Linux上)用

代码语言:javascript
复制
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -fPIC -I/usr/lib/pymodules/python2.7/numpy/core/include -I/usr/include/python2.7 -c gilexample.c -o gilexample.o
gcc -pthread -shared gilexample.o -o gilexample.so

并在Python中进行测试

代码语言:javascript
复制
import gilexample
gilexample.sum([1,2,3])

Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS之间的代码安全吗?它访问Python对象的内容,我不想在内存中复制(可能是大的)数组。

代码语言:javascript
复制
#include <Python.h>
#include <numpy/arrayobject.h>

// The relevant function
static PyObject * sum(PyObject * const self, PyObject * const args) {
  PyObject * X;
  PyArg_ParseTuple(args, "O", &X);
  PyObject const * const X_double = PyArray_FROM_OTF(X, NPY_DOUBLE, NPY_ALIGNED);
  npy_intp const size = PyArray_SIZE(X_double);
  double * const data = (double *) PyArray_DATA(X_double);
  double sum = 0;

  Py_BEGIN_ALLOW_THREADS // IS THIS SAFE?

  npy_intp i;
  for (i=0; i<size; i++)
    sum += data[i];

  Py_END_ALLOW_THREADS

  Py_DECREF(X_double);
  return PyFloat_FromDouble(sum);
}

// Python interface code
// List the C methods that this extension provides.
static PyMethodDef gilexampleMethods[] = {
  {"sum", sum, METH_VARARGS},
  {NULL, NULL, 0, NULL}     /* Sentinel - marks the end of this structure */
};

// Tell Python about these methods.
PyMODINIT_FUNC initgilexample(void)  {
  (void) Py_InitModule("gilexample", gilexampleMethods);
  import_array();  // Must be present for NumPy.
}
EN

回答 1

Stack Overflow用户

发布于 2012-01-11 18:40:44

可以在线程没有GIL的情况下访问GIL对象中的数据吗?

不你不能。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8824739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档