【问题标题】:Which operations can be done in parallel without grabbing the GIL? [duplicate]哪些操作可以在不获取 GIL 的情况下并行完成? [复制]
【发布时间】:2014-12-14 01:42:57
【问题描述】:

我正在研究将 Python 嵌入到多线程 C++ 程序中,并使用 numpy 并行进行简单计算。

换句话说,我使用PyRun_SimpleString 来调用numpy 函数。如果我只写入现有的 numpy 数组,并且注意不要从不同的线程修改同一个数组,是否需要获取 GIL?

编辑,如 cmets 中所述,此处已解决:Global Interpreter Lock and access to data (eg. for NumPy arrays)

一个可能的解决方案是使用负责释放 GIL 的 ctypes 直接使用 numpy c 接口:https://stackoverflow.com/a/5868051/419116

对于后代,当您尝试在不获取 GIL 的情况下执行“a*=2”时实际发生的情况如下:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000acc242 in PyImport_GetModuleDict ()
    at python_runtime/v2_7/Python/import.c:433
433     PyInterpreterState *interp = PyThreadState_GET()->interp;

#0  0x0000000000acc242 in PyImport_GetModuleDict ()
    at python_runtime/v2_7/Python/import.c:433
#1  0x0000000000accca1 in PyImport_AddModule (
    name=0x13e9255 <.L.str53> "__main__")
    at python_runtime/v2_7/Python/import.c:672
#2  0x0000000000aab29f in PyRun_SimpleStringFlags (
    command=0x13e8831 <.L.str10> "a*=2", flags=0x0)
    at python_runtime/v2_7/Python/pythonrun.c:976
#3  0x00000000008e3300 in main (argc=1, argv=0x7fffd2226ec0)
    at python_embed/interactive_nogil.cc:56

这里PyThreadState_GET_PyThreadState_Current 的宏,它是一个空指针。所以显然抓住 GIL 还涉及设置任何 Python 操作所需的一些 Thread 变量

【问题讨论】:

  • @YaroslavBulatov 任何不涉及 Python 对象的操作...

标签: python numpy python-internals


【解决方案1】:

PyRun_SimpleString 需要 GIL,因为它调用 Python 解释器。如果您使用 PyRun_SimpleString 而不拥有 GIL,则该进程将出现段错误。

NumPy C API 的某些部分不需要 GIL,但只有不涉及 Python 对象或解释器的部分。一个例子是PyArray_DATA 宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2020-10-27
    • 2021-07-10
    • 2011-02-14
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多