如果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?
我尝试创建一个将托管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_THREADS
和Py_END_ALLOW_THREADS
。/div>
相关文章:
- 我的控制台处理程序不处理 CTRL+C,即使设置正确
- 处理程序在处理 SIGWINCH 后挂起
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- 程序在处理矢量时会接收`sigtrap'
- 如果C/C Python3扩展托管HTTP服务器并将Python代码称为请求处理程序,则如何处理并发
- 如何允许我的应用程序C 请求ICMPV4?Windows 8.1
- 无法获取程序来处理WM_PowerBroadcast消息
- Boost.Asio:由于线程退出或应用程序请求,I/O 操作已中止
- C#/C++:启动应用程序并处理其对系统的I/O调用
- 为什么我需要在多线程程序中使用pthread_sigmask来确保设置处理程序正在处理信号
- 在控制台应用程序中处理空的windows消息队列
- 如何使用 WT 实现 AJAX 请求处理
- 在Direct2D应用程序中处理HRESULT
- 文本框为空时C++ Windows 窗体应用程序未处理的异常错误
- 在多线程c++服务器应用程序中处理非常量全局配置
- 将 INT3 中断保留给视觉工作室上的应用程序异常处理程序
- 在一个程序中处理多个QT Designer UI文件的最佳方法是什么?
- 使用提升程序选项处理 2 级命令的最佳方法
- GPU 驱动程序错误处理
- 如何从 Http 请求处理程序正确终止 POCO 服务器应用程序