如果C/C Python3扩展托管HTTP服务器并将Python代码称为请求处理程序,则如何处理并发

How to handle concurrency if C/C++ Python3 extension hosting a http server and calling python code as request handler?

本文关键字:程序 请求处理 何处理 并发 处理 代码 扩展 Python3 HTTP 服务器 如果      更新时间:2023-10-16

我尝试创建一个将托管HTTP服务器的Python扩展程序。当特定请求进来时,扩展程序从扩展名消费者调用Python代码来处理请求。由于HTTP服务器是源多线程,因此控制器/Python代码将并行调用。

根据Python文档,我尝试执行以下操作(删除了所有错误处理代码分支以使其更简单(

static string CallingPythonFunc(string input)
{
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();
    PyObject *arglist;
    PyObject *result;
    /* Time to call the callback */
    PyGILState_Release(gstate);
    return output;
}

my_python_func可能非常简单,如下所示:

def foo(input):
    return input+"123"

显然,如果同时提出了两个请求,则上述代码将陷入僵局。

我还找到了其他一些样本1, sample2和stackoverflow答案1,答案2。但是似乎两个示例代码都创建线程,我的情况是由HTTP服务器创建的线程。两个stackoverflow答案使人感到困惑。我认为上面的代码应该等待GIL可用,然后运行python呼叫代码,然后从关键部分中脱下。但似乎我上面显示的并非如此。

最终,我通过与Python的某个大师交谈来获得解决方案:我需要致电PyEval_InitThreads()并用Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS。/div>