如何同时在两个不同的线程中执行PyObject_CallObject()?

时间:2014-09-30 07:44:46

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

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

1 个答案:

答案 0 :(得分:2)

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

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

  

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

相关问题