我有一个接受请求的服务器应用程序,需要运行一些 Python,其中一些调用我的基于 C 的扩展 DLL。如果我在整个请求期间完全锁定 GIL,一切正常。但是我想在基于 C 的扩展 DLL 中释放它,当长时间操作发生时,可以处理更多请求。到目前为止,这是我的方法:
A. Request arrives on thread I don't control
B. Call PyGILState_Ensure
C. Call into Python runtime via PyRun_String
D. Python calls my MethodA in my C-based code
E. Call PyGILState_Release
F. Do long-ish processing
G. Call PyGILState_Ensure to lock GIL again
H. Return control to Python for further script processing
I. Python runtime returns
J. Call PyGILState_Release
以上所有步骤都是单线程(系统中有很多类似的线程)。
上面的调用序列总是在 Python 深处的步骤 (H) 中某处抛出异常(我似乎无法从堆栈跟踪中找出)。但是,如果我在 (B) 处对 PyGILState_Ensure 进行额外调用,以便 (E) 和 (F) 处的调用最终不会做任何事情,那么一切都会完美运行。
有人可以帮我理解我做错了什么吗?我真的很想在长时间的操作中释放 GIL,以便其他请求可以取得进展。