Pybind11: Почему асинхронный вызов из python правильно не выполняет обратные вызовы в C ++? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть метод python, который реализован следующим образом:

def start(self):
    try:
        self.is_running = True
        self._main_loop()

    except Exception as ex:
        path='exceptions-servicecore.log'
        track = traceback.format_exc()
        exception_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
        with open(path, 'a') as f:
            f.writelines(f'\n{exception_time} : exception occured {ex.args} \n{track}')

def start_async(self):
    st = threading.Thread(target=self.start) 
    st.start()

Здесь _main_loop() затем запускает несколько команд и выполняет обратные вызовы, отправленные из C ++ / C# et c.
Использование Pybind11 Я просто вызываю start_async следующим образом:

this->startFuncAsync = this->obj.attr("start_async");
...
CORE_API void Core::Start(bool async)
{
    try
    {
        if (async)
        {
            this->startFuncAsync();
        }
        else
        {
            this->startFunc();
        }
    }
    catch (std::exception ex)
    {
        std::cout << ex.what() << std::endl;
    }
}

Но, похоже, он просто не работает должным образом.
Он отлично работает в Python , но когда дело доходит до C ++ или C#, которые вызывают функцию C++ выше, это не показывает никакого вывода! Секции python, которые вызывают обратные вызовы, работают, когда я записываю их выполнение в текстовый файл. однако на стороне клиента нет активности. Я не вижу каких-либо выводов для C ++ или C#. Обратные вызовы работают и выводят необходимую информацию на консоль (C ++ или C#).
Функция non-asyn c (start), однако, работает просто отлично.

Итак, мой вопрос, это ожидаемое поведение? Разве это не должно работать независимо от того, как функция вызывается в Python или за ее пределами?

1 Ответ

0 голосов
/ 18 апреля 2020

Эта проблема, похоже, связана с Pybind11, похоже. То есть может работать только один поток выполнения, и все операции должны выполняться в одном и том же потоке.
Если метод запускается как отдельный поток в python, как то, что мы имеем здесь (start), вызывая другие методы в c ++ будет использовать другой поток, и, таким образом, вы сможете взаимодействовать с ним, он станет как поток зомба ie, так как вы не сможете взаимодействовать с ним или даже остановить его.
Логическим способом было бы выполнить это на стороне C ++, где у вас есть контроль над потоком.

...