当前位置:  开发笔记 > 编程语言 > 正文

如何从外语线程调用python函数(C++)

如何解决《如何从外语线程调用python函数(C++)》经验,为你挑选了1个好方法。

我正在开发一个程序,使用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的函数,因为有Global Interpreter Lock.python的GIL非常复杂,我不知道它是如何工作的.对不起,我能做的就是问.我的问题是.在从线程调用Python函数之前和之后我应该怎么做?

它可能看起来像这样.

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

谢谢.林维克.



1> Éric Malenfa..:

从PEP 311 http://www.python.org/dev/peps/pep-0311/查看PyGILState_Ensure()/ PyGILState_Release()

以下是PEP本身的一个例子:

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);
}

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有