From 427bb56507ea22658ebcf39c1fedd71936f4b8ea Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Mon, 4 May 2026 10:49:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=BC=80=E5=90=AFPython?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=90=8E=EF=BC=8C=E7=A8=8B=E5=BA=8F=E9=80=80?= =?UTF-8?q?=E5=87=BA=E6=97=B6=E5=BC=82=E5=B8=B8=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/pyinvoker.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/server/pyinvoker.cpp b/server/pyinvoker.cpp index ccd0ca7f..eb487134 100644 --- a/server/pyinvoker.cpp +++ b/server/pyinvoker.cpp @@ -24,6 +24,7 @@ extern ArgsType make_json(const MediaInfo &args); extern void fillSockInfo(Json::Value & val, SockInfo* info); extern ArgsType getRecordInfo(const RecordInfo &info); extern std::string g_ini_file; +static std::shared_ptr g_instance; template typename std::enable_if::value, py::capsule>::type to_python(const T &obj) { @@ -388,11 +389,28 @@ PYBIND11_EMBEDDED_MODULE(mk_loader, m) { py::arg("opt") = py::dict() ); - m.def("set_fastapi", [](const py::object &check_route, const py::object &submit_coro) { + m.def("set_fastapi", [](const py::function &check_route, const py::function &submit_coro) { static void *fastapi_tag = nullptr; NoticeCenter::Instance().delListener(&fastapi_tag, Broadcast::kBroadcastHttpRequest); - NoticeCenter::Instance().addListener(&fastapi_tag, Broadcast::kBroadcastHttpRequest, [check_route, submit_coro](BroadcastHttpRequestArgs) { - handle_http_request(check_route, submit_coro, parser, invoker, consumed, sender); + struct py_context { + py::function check_route; + py::function submit_coro; + std::shared_ptr invoker; + ~py_context() { + { + py::gil_scoped_acquire guard; + check_route = py::function { }; + submit_coro = py::function { }; + } + invoker = nullptr; + }; + }; + auto ptr = std::make_shared(); + ptr->check_route = check_route; + ptr->submit_coro = submit_coro; + ptr->invoker = g_instance; + NoticeCenter::Instance().addListener(&fastapi_tag, Broadcast::kBroadcastHttpRequest, [ptr](BroadcastHttpRequestArgs) { + handle_http_request(ptr->check_route, ptr->submit_coro, parser, invoker, consumed, sender); }); }); @@ -570,8 +588,6 @@ bool set_python_path() { return true; } -static std::shared_ptr g_instance; - PythonInvoker &PythonInvoker::Instance() { static toolkit::onceToken s_token([]() { g_instance.reset(new PythonInvoker);