2

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

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

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

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

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

但是,由于 Python 实现(源代码/Modules/selectmodule.c)不处理这种情况(EINTR),我是否被迫实现自己的 C/C++ 串行驱动程序和睡眠功能以在 Python 中使用?或者为了这个项目离开 Python?由于 Python 使编程变得如此容易,我非常感兴趣,如果有人遇到过类似的问题并找到了一个很好的解决方法或简单的解决方法。现在我没有能力自己为 Python 模块制定必要的修复程序。或者也许我错过了其他选择?

有任何想法吗?

4

1 回答 1

0

尝试使用signal.sigintterupt使SIGALRM信号自动重启系统调用。或者你可以signal.signal(signal.SIGALRM, signal.SIG_IGN)用来忽略警报信号,假设你没有将它用于任何事情。

于 2011-11-15T19:29:54.380 回答