调用后允许从蟒线程使用SWIG生成的Python扩展一个阻塞I / O代码
-
22-09-2019 - |
题
我已经写了Python扩展包装现有C ++库 LIVE555 (包裹RTSP客户端接口来具体说明)在SWIG 。当它在一个单独的线程运行,但只要我调用库的事件循环功能,Python解释器永远不会将控制权交还给该扩建工程。所以,如果我调用事件循环之前创建一个使用threading.Timer
正确的计划任务,该任务永远不会被一次事件循环开始执行。要解决这个问题,我在包装周围的每一个Py_BEGIN_ALLOW_THREADS
函数调用CXX文件生成的SWIG自动手动添加Py_END_ALLOW_THREADS
和doEventLoop()
宏。但现在,我想这样做(即允许线程)时,SWIG生成的代码本身,而不是手动更改任何代码。有没有人做过类似的事情在痛饮?
P.S。 - 我也考虑切换到任何其他框架(如SIP)来得到这个工作。我选择痛饮比任何其他技术是因为写痛饮接口是真的很不容易,我只是必须包括现有的头文件。
解决方案
痛饮为您提供足够的钩子,以帮助实现这一目标。如果粗的解决方案足以满足您的需求,有一件事我已经在过去所做的是将这样的事情在我.swig文件:
%exception {
Py_BEGIN_ALLOW_THREADS
$action
Py_END_ALLOW_THREADS
}
此(AB)使用用于以装饰用GIL解锁/锁定那些呼叫与某种错误处理逻辑的装饰C函数调用SWIG设施。请参见异常处理与在SWIG文档%的异常了解什么是细节会在这里。
不隶属于 StackOverflow