在使用SWIG生成的python扩展中调用阻塞i / o代码后允许来自python的线程

时间:2010-03-24 19:11:40

标签: python swig rtsp-client

我编写了一个python扩展,在SWIG中包装现有的C ++库live555(将RTSP客户端接口包装为特定的)。扩展在单个线程中运行时起作用,但是一旦我调用了库的事件循环函数,python解释器就永远不会得到控制权。因此,如果我在调用事件循环之前使用threading.Timer创建一个计划任务,那么一旦事件循环开始,该任务就永远不会被执行。为解决此问题,我在每个Py_BEGIN_ALLOW_THREADS函数调用周围的SWIG自动生成的包装器cxx文件中手动添加了Py_END_ALLOW_THREADSdoEventLoop()个宏。但是现在,当SWIG生成代码本身而不是手动更改任何代码时,我想做同样的事情(即允许线程)。有没有人在SWIG做过类似的事情?

P.S。 - 我还会考虑切换到任何其他框架(如SIP)来实现这一点。我选择SWIG而不是任何其他技术是因为编写SWIG接口非常简单,我只需要包含现有的头文件。

1 个答案:

答案 0 :(得分:3)

SWIG为您提供了大量帮助以帮助实现这一目标。如果粗略的解决方案足以满足您的需求,我过去做过的一件事就是在我的.swig文件中添加这样的东西:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

这个(ab)使用SWIG工具用某种错误处理逻辑来装饰C函数调用,以便用GIL解锁/锁定装饰这些调用。有关此处发生了什么的详细信息,请参阅SWIG文档中的Exception handling with %exception