【问题标题】:How to execute PyObject_CallObject() in two different threads simultaneously?如何同时在两个不同的线程中执行 PyObject_CallObject()?
【发布时间】:2014-09-30 07:44:46
【问题描述】:

我有两个函数同时在两个线程上运行。两个函数都调用这个方法PyObject_CallObject(pFunc,pArgs) 执行两个不同的python函数。但是当我尝试这样做时,我得到了access violation reading location 异常。两个函数中使用的pFuncpArgs 是该函数的本地函数,并且没有共享数据。还是我怎么得到异常?

【问题讨论】:

    标签: multithreading python-2.7 python-c-api


    【解决方案1】:

    这是不可能的。在调用任何 Python CAPI 函数之前,您必须获取全局解释器锁 (GIL)。只有少数函数可以在没有 GIL 的情况下调用。

    https://docs.python.org/2/c-api/init.html#thread-state-and-the-global-interpreter-lock

    Python 解释器不是完全线程安全的。为了支持多线程 Python 程序,有一个全局锁,称为全局解释器锁或 GIL,它必须由当前线程持有,然后才能安全地访问 Python 对象。如果没有锁,即使是最简单的操作也可能在多线程程序中导致问题:例如,当两个线程同时增加同一个对象的引用计数时,引用计数最终可能只增加一次而不是两次。

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多