Как вызвать функцию Python из потока иностранного языка (C ++) - PullRequest
4 голосов
/ 04 февраля 2009

Я разрабатываю программу, которая использует DirectShow для захвата аудиоданных из медиа файлы. DirectShow использует поток для передачи аудиоданных в обратный вызов функция в моей программе, и я позволил этой функции обратного вызова вызвать другой функция в Python.

Я использую Boost.Python, чтобы обернуть мою библиотеку, функция обратного вызова:

class PythonCallback {
private:
    object m_Function;
public:
    PythonCallback(object obj)
        : m_Function(obj)
    {}

    void operator() (double time, const AudioData &data) {
        // Call the callback function in python
        m_Function(time, data);
    }

};

Здесь возникает проблема, поток DirectShow вызывает мой PythonCallback, а именно вызов функции в Python. Как только он звонит, мой программа просто вылетает. Я обнаружил, что это должно быть проблемой с многопоточностью. Затем я нашел этот документ:

http://docs.python.org/c-api/init.html

Кажется, что моя программа не может вызвать функцию Python из потока напрямую, потому что есть глобальная блокировка интерпретатора. GIL питона это так сложно, я понятия не имею, как это работает. Извини, что я могу сделать это спросить. Мой вопрос Что я должен делать до и после звонка Функция Python из потоков?

Может выглядеть так.

void operator() (double time, const AudioData &data) {
    // acquire lock
    m_Function(time, data);
    // release lock
}

Спасибо. Виктор Лин.

Ответы [ 2 ]

6 голосов
/ 04 февраля 2009

Посмотрите на PyGILState_Ensure () / PyGILState_Release (), из PEP 311 http://www.python.org/dev/peps/pep-0311/

Вот пример, взятый из самого ПКП:

void SomeCFunction(void)
{
    /* ensure we hold the lock */
    PyGILState_STATE state = PyGILState_Ensure();
    /* Use the Python API */
    ...
    /* Restore the state of Python */
    PyGILState_Release(state);
}
1 голос
/ 04 февраля 2009

Пусть обратный вызов c ++ помещает данные в очередь. Пусть Python-код опрашивает очередь для извлечения данных.

...