Python在Linux中选择和处理EINTR的任何变通方法?

时间:2011-11-15 19:13:39

标签: python linux signals eintr

在我最近的一个项目中,我碰巧遇到了同样的过程(Python程序,它是一个多线程应用程序):

  • 将Boost :: Python模块连接到与AVT PvAPI SDK链接的库,即在最广泛的意义上是从相机获取图像帧的驱动程序。这个库(PvApi SDK)每隔几毫秒内部产生一个SIGALRM

  • 另一个普通的Python模块,旨在使用pyserial进行一些串行I / O.这反过来使用Python的包装器select.select到POSIX select。每当信号由另一个模块产生时,结果就会中断(errno == EINTR)。

  • 在Python time.sleep的任何调用中都可以观察到相同的问题。在内部使用的POSIX sleep

这些问题在Windows中显然不存在,因为睡眠和选择不会被那里的任何信号中断(根据文档)。这些问题在C / C ++中并不是什么大问题,因为如果它们被中断,你可以(并且应该)重新启动它们。

但是,由于Python实现(source code / Modules / selectmodule.c)不处理这种情况(EINTR),我是否被迫实现自己的C / C ++串行驱动程序并进入睡眠状态在Python中使用的函数?或者为了这个项目而放弃Python?由于Python使编程变得如此简单,我很感兴趣,如果有人遇到类似的问题,并找到了一个很好的解决方法或简单的解决方案。现在我没有能力自己解决Python模块的必要修复。或许我错过了其他一些选择?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

尝试使用signal.sigintterupt使SIGALRM信号自动重启系统调用。或者您可以使用signal.signal(signal.SIGALRM, signal.SIG_IGN)忽略警报信号,假设您没有使用它。