我已经写了Python扩展包装现有C ++库 LIVE555 (包裹RTSP客户端接口来具体说明)在SWIG 。当它在一个单独的线程运行,但只要我调用库的事件循环功能,Python解释器永远不会将控制权交还给该扩建工程。所以,如果我调用事件循环之前创建一个使用threading.Timer正确的计划任务,该任务永远不会被一次事件循环开始执行。要解决这个问题,我在包装周围的每一个Py_BEGIN_ALLOW_THREADS函数调用CXX文件生成的SWIG自动手动添加Py_END_ALLOW_THREADSdoEventLoop()宏。但现在,我想这样做(即允许线程)时,SWIG生成的代码本身,而不是手动更改任何代码。有没有人做过类似的事情在痛饮?

P.S。 - 我也考虑切换到任何其他框架(如SIP)来得到这个工作。我选择痛饮比任何其他技术是因为写痛饮接口是真的很不容易,我只是必须包括现有的头文件。

有帮助吗?

解决方案

痛饮为您提供足够的钩子,以帮助实现这一目标。如果粗的解决方案足以满足您的需求,有一件事我已经在过去所做的是将这样的事情在我.swig文件:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

此(AB)使用用于以装饰用GIL解锁/锁定那些呼叫与某种错误处理逻辑的装饰C函数调用SWIG设施。请参见异常处理与在SWIG文档%的异常了解什么是细节会在这里。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top