在我最近的一个项目中,我碰巧在同一个进程中(一个Python程序,它是一个多线程应用程序):
- 一个Boost::Python模块到一个链接到AVT PvAPI SDK的库,也就是最广义的从相机获取图像帧的驱动程序。这个库(PvApi SDK)每隔几毫秒就在内部生成一个SIGALRM。
- 这是另一个普通的Python模块,用于使用pyserial执行一些串行I/O。这反过来使用Python的 Package 器select.select到POSIX select。结果是每次其他模块产生信号时都会中断(
errno == EINTR
)。 - 在内部使用的Python的time.sleep或POSIX sleep的任何调用上都可以观察到相同的问题。
这些问题在Windows中显然不存在,因为sleep和select不会被任何信号中断(根据文档)。这些问题在C/C ++中也不是什么大问题,因为如果调用被中断,您可以(也应该)重新启动它们。
然而,作为Python的实现(source code/模块/选择模块. c)不处理这种情况(x一m一n一x),我是被迫实现我自己的C/C ++串行驱动程序和sleep函数来在Python中使用吗?还是为了这个项目而放弃Python?由于Python使编程变得如此容易,我非常感兴趣是否有人遇到过类似的问题,并找到了一个很好的解决方案或简单的修复方法。现在我没有能力自己为Python模块做必要的修复,或者我错过了其他的选择?
有什么想法吗?
2条答案
按热度按时间ufj5ltwl1#
尝试使用
signal.sigintterupt
使SIGALRM
信号自动重启系统调用,或者使用signal.signal(signal.SIGALRM, signal.SIG_IGN)
忽略报警信号,假设您不使用它。vngu2lb82#
同时,发布了PEP以解决该问题(PEP 475)。
看起来,这种行为在Python 3.5 2015年就已经被修复了。