在python中,ctypes创建的线程也是在GIL下创建的吗?
所有python线程(在CPython中)都在GIL下 如果线程是由在python中,ctypes创建的线程也是在GIL下创建的吗?,python,c,multithreading,ctypes,gil,Python,C,Multithreading,Ctypes,Gil,所有python线程(在CPython中)都在GIL下 如果线程是由ctypes创建的,该怎么办 例如,python只是通过C库调用下面的函数,该函数在C区域而不是python中创建线程 #include<thread> int createUnitTestThread(int sasAddr){ sasEngine->thread = new std::thread(....); return 0; } #包括 int createUnitTestThr
ctypes
创建的,该怎么办
例如,python只是通过C库
调用下面的函数,该函数在C
区域而不是python中创建线程
#include<thread>
int createUnitTestThread(int sasAddr){
sasEngine->thread = new std::thread(....);
return 0;
}
#包括
int createUnitTestThread(int sasAddr){
sasEngine->thread=new std::thread(…);
返回0;
}
它是相同的还是不同的?不像线程在GIL下,Python解释器中的操作是相同的(包括获取和执行大多数操作码之类的内容,所以执行Python代码的线程大部分是互锁运行的)
C++线程将运行免费,只要它不在Python解释器中调用回函数(用户回调函数或来自Python的函数。):< /P>谢谢你的回答!还有一个问题,尽管
C++线程
不在GIL
下,但它仍然在python解释器
上运行,并且具有相同的PID
,对吗?我很确定这是件坏事™ 如果您从一个非Python创建的线程调用Python,就会发生这种情况,除非您以某种方式显式注册它。@asleea:作为一个线程,是的(好吧,在Linux下是有点混乱,因为一切实际上都是一个任务,所以您可以说它有一个不同的进程id,但不管怎样)。@o11c:可能,尽管我不确定,我从未从线程显式调用python.h stuff;无论如何,这一点建议对回调(ctypes支持并经常使用)非常有用。@o11c,线程可以通过调用PyGILState
获取GIL,这是ctypes回调在调用目标Python函数之前所做的。