2

私の最近のプロジェクトの 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 モジュールに必要な修正を自分で行う能力がありません。それとも、他のオプションを見逃したのでしょうか?

何か案は?

4

1 に答える 1

0

を使用signal.sigintteruptして、SIGALRMシグナル再起動システム コールを自動的に作成してみてください。またはsignal.signal(signal.SIGALRM, signal.SIG_IGN)、アラーム信号を何にも使用していないと仮定して、アラーム信号を無視するために使用できます。

于 2011-11-15T19:29:54.380 に答える