Вызовите функцию Python из C++ в отдельном потоке Python с помощью pybind11.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Вызовите функцию Python из C++ в отдельном потоке Python с помощью pybind11.

Сообщение Anonymous »

У меня есть привязка Pybind11:

Код: Выделить всё

struct PythonModule {

static std::function m_function;

static void setCallback(std::function &function) {
m_function = function;
}

static void call() {
m_function();
}

};

PYBIND11_EMBEDDED_MODULE(MyModule, m) {
m.def("set_callback", &PythonModule::setCallback);
};
и этот скрипт Python:

Код: Выделить всё

def test_function():
import time
print('Start')
time.sleep(3.0)
print('End')

MyModule.set_callback(test_function)
Теперь, если я вызову функцию обратного вызова три раза следующим образом:

Код: Выделить всё

PythonModule::call();
PythonModule::call();
PythonModule::call();
Тогда результат:

Код: Выделить всё

Start
End
Start
End
Start
End
с задержкой в ​​3,0 секунды между каждым началом и завершением из-за сна.
Есть ли способ вызвать эту функцию из C++ через Pybind11 в асинхронный или многопоточный способ?
Чтобы результат был таким:

Код: Выделить всё

Start
Start
Start
End
End
End
Один из способов, который я могу придумать, — это объявить функцию Python как асинхронную и написать такую ​​функцию Python:

Код: Выделить всё

import asyncio

def call_callback(callback):
asyncio.ensure_future(callback)
И вызвать эту функцию из C++, когда каким-то образом выполняется асинхронный цикл... но это кажется довольно беспорядочным. Есть ли лучший способ?


Подробнее здесь: https://stackoverflow.com/questions/782 ... h-pybind11
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»