Проблемы, связанные с Boost :: Python и Boost :: Threads - PullRequest
7 голосов
/ 07 июля 2010

Я и мой друг разрабатываем приложение, которое использует Boost :: Python. Я определил интерфейс в C ++ (хорошо чистый виртуальный класс), предоставляемый через Boost :: Python пользователям, которые должны наследовать от него и создавать класс, который приложение принимает и использует для какого-то механизма обратного вызова.

Все, что далеко, идет довольно хорошо. Теперь, обратный вызов функции может занять некоторое время (пользователь, возможно, запрограммировал некоторые тяжелые вещи) ... но нам нужно перекрасить окно, чтобы оно не выглядело "застрявшим". Мы хотели использовать Boost :: Thread для этого , Одновременно будет выполняться только один обратный вызов (никакие другие потоки не будут вызывать python одновременно), поэтому мы подумали, что это будет не так уж и много ... так как мы не используем потоки ни внутри python, ни в C ++ код для Python.

То, что мы делаем, - это вызов PyEval_InitThreads () сразу после Py_Initialize (), затем, перед вызовом функции обратного вызова внутри собственного потока поддержки, мы используем макрос PY_BEGIN_ALLOW_THREADS и, а также макрос PY_END_ALLOW_THREADS, когда поток завершился.

Я думаю, мне не нужно говорить, что выполнение никогда не достигает второго макроса. Он показывает несколько ошибок при каждом запуске ... но всегда при вызове фактического обратного вызова. Я много гуглял, даже читал некоторые документы PEP относительно потоков, но все они говорят о многопоточности внутри модуля python (что, я не думаю, это просто чистый виртуальный класс) или о многопоточности внутри python, а не о основной приложение вызывает Python из нескольких потоков.

Пожалуйста, помогите, это меня несколько часов расстраивает.

Ps. помощь!

1 Ответ

1 голос
/ 11 июля 2010

Python может вызываться из нескольких потоков последовательно, я не думаю, что это проблема.Мне кажется, что ваши ошибки происходят из-за плохого кода на C ++, как вы сказали, что ошибки произошли после PY_BEGIN_ALLOW_THREADS и до PY_END_ALLOW_THREADS.

Если вы знаете, что это не так, вы можете опубликовать немного больше своего реального кодаи покажите, где именно его ошибки и какие именно ошибки он дает?

...