对于Python在Linux中选择和处理EINTR,有什么解决办法吗?

9lowa7mx  于 2023-01-16  发布在  Linux
关注(0)|答案(2)|浏览(118)

在我最近的一个项目中,我碰巧在同一个进程中(一个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模块做必要的修复,或者我错过了其他的选择?
有什么想法吗?

ufj5ltwl

ufj5ltwl1#

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

vngu2lb8

vngu2lb82#

同时,发布了PEP以解决该问题(PEP 475)。
看起来,这种行为在Python 3.5 2015年就已经被修复了。

相关问题