私の最近のプロジェクトの 1 つで、たまたま同じプロセス (Python プログラム、そのマルチスレッド アプリケーション) を使用していました。
AVT PvAPI SDKにリンクされたライブラリへの Boost::Python モジュール、つまり最も広い意味でカメラから画像フレームを取得するためのドライバー。このライブラリ (PvApi SDK) は、数ミリ秒ごとにSIGALRMを内部的に生成します。
pyserialを使用してシリアル I/O を実行することを目的とした別のプレーンな Python モジュール。これは、Python のラッパーselect.selectを POSIX selectに使用します。
errno == EINTR
これは、信号が他のモジュールによって生成されるたびに中断されることが判明しました ( )。Python のtime.sleep、resp の呼び出しでも同じ問題が発生する可能性があります。内部で使用されるPOSIX sleep 。
これらの問題は明らかに Windows には存在しません。(ドキュメンテーションによると) スリープと選択はシグナルによって中断されないためです。これらの問題は、C/C++ ではそれほど問題ではありません。呼び出しが中断された場合は、呼び出しを再開することができます (ただし、再開する必要があります)。
ただし、Python の実装 (ソース コード/Modules/selectmodule.c) はこのケース ( ) を処理しないEINTR
ため、Python で使用するために独自の C/C++ シリアル ドライバーとスリープ機能を実装する必要がありますか? それとも、このプロジェクトのために Python から離れますか? Python はプログラミングを非常に簡単にするので、誰かが同様の問題を抱えていて、これに対する優れた回避策または簡単な修正を見つけた場合、私は非常に興味があります. 現時点では、Python モジュールに必要な修正を自分で行う能力がありません。それとも、他のオプションを見逃したのでしょうか?
何か案は?