boost :: python - 如何从C++调用自己的线程中的python函数?

Nin*_*rez 8 c++ python multithreading boost-python c++11

我有一个用python编写的模块.这个模块是我在Python中实现的许多不同功能的接口:

EmbeddingInterface.py只是导入该模块并创建一个实例:

import CPPController

cppControllerInstance = CPPController()
Run Code Online (Sandbox Code Playgroud)

我想在c ++中使用cppControllerInstance.这是我到目前为止所做的:

#include <Python.h>
#include <boost\python.hpp>

using namespace boost;

python::object createController()
{
    try
    {
        Py_Initialize();

        python::object mainModule = python::import("__main__");
        python::object mainNamespace = mainModule.attr("__dict__");

        python::dict locals;

        python::exec(
            "print \"loading python implementetion:\"\n"
            "import sys\n"
            "sys.path.insert(0, \"C:\\Projects\\Python\\ProjectName\\Panda\")\n"
            "import EmbeddingInterface\n"
            "controller = EmbeddingInterface.cppControllerInstance\n",
            mainNamespace, locals);

            python::object controller = locals["controller"];
            return controller;
    }
    catch(...) {}
}
Run Code Online (Sandbox Code Playgroud)

问题:

这个'控制器'有一些必须异步调用的函数.它的工作是连续的,此外它可以抛出异常.这就是为什么std :: async听起来很棒.

但它不起作用:

int main()
{
    python::object controller = createController();
    python::object loadScene = controller.attr("loadScene");
    //loadScene(); // works OK but blocking!
    std::async(loadScene); // non blocking but nothing happens!
    while(true); // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

我尝试用自己的线程调用python函数'loadScene',但函数似乎是阻塞的.它永远不会回来.

这样做的正确方法是什么?

Sat*_*tie 0

看来您误解了std::async的行为

一段测试代码:

#include <iostream>
#include <chrono>
#include <thread>
#include <future>

int doSomething(){
  std::cout << "do something"<<std::endl;
  return 1;
}

int main(){
   auto f = std::async(doSomething);

   std::this_thread::sleep_for(std::chrono::seconds(3));
   std::cout <<"wait a while"<<std::endl;
   f.get();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

wait a while
do something
Run Code Online (Sandbox Code Playgroud)

改变线路

auto f = std::async(doSomething);
Run Code Online (Sandbox Code Playgroud)

auto f = std::async(std::launch::async,doSomething);
Run Code Online (Sandbox Code Playgroud)

然后输出:

do something
wait a while
Run Code Online (Sandbox Code Playgroud)

作为您的示例,要立即在另一个线程中运行它,您可以尝试:

std::async(std::launch::async,loadScene);
Run Code Online (Sandbox Code Playgroud)