質問

ctypes を通じて呼び出す .so/.dll からの長時間実行関数を使用する Python GUI アプリがあります。

別のスレッドまたはプロセスで実行されている関数と通信して、早期終了を要求できるようにする方法を探しています (部分的な結果を返す前に C 側で何らかの作業が必要です)。これにはパイプからの何らかの信号の受信または読み取りが必要になると思いますが、できるだけ単純にしておきたいと思います。

この種の問題を解決するための最良のアプローチは何だと思いますか?Python側とC側の両方でコードを変更できます。

役に立ちましたか?

解決

あなたがここに答える必要があります二つの部分があります:1二つのプロセス(あなたのGUIや機能を実行するプロセス)間の通信方法の場合は、もう一方はそれが非同期リクエストに応答して(あなたの関数を変更する方法です)「ああ、私はちょうど私が持っているものは何でも返すように言われてきた」。

2番目の質問への答えを働くことは、おそらく最初の答えを決定します。あなたは(あなたがプロセスの制御を取得するシグナルハンドラを取得した場合には、他の場所より詳細な手順を探して、あなたの関数に制御を戻す前に、あなたの内部データ構造を変更することができます)信号によってそれを行うことができ、またはあなたの機能を持つことができます(ミリ秒ごとにコマンド待ちがあるかどうかを確認し、存在する場合、それが何であるかを参照)コマンドの制御インタフェースを監視します。

()、パイプ()と(選択)最初のケースでは、あなたは、(信号()、はsighandler_t)を処理ANSI C信号をしたいと思います第二に、あなたはおそらく、パイプまたは類似をしたいと思います。

他のヒント

あなたがCやPythonの両側を変更することができることに言及します。 Cのいずれかのソケットまたは信号コードを記述することを避けるために、それはセットアップ、作業の小さな小包、およびクリーンアップを実行3つのより小さい別々の機能に大きなCの関数を分割するのが最も簡単かもしれません。作業小包は、応答性と低いオーバーヘッドのバランスを取るのに約1ミリ秒と1秒の実行時間の間でなければなりません。データサイズを変更するに直面して、このようにもチャンクに計算を分割するのは難しいことができますが、あなたはまた、I / Oやった単一の大きな機能で同じ課題を持つことになります。

のctypesを通じて、これらの3つの機能を呼び出すPythonでワーカープロセスを書きます。ワーカープロセスが計算を停止するには、GUIからのメッセージは、キューのオブジェクトをチェックしてい早いです。代わりにQueue.getの非ブロックQueue.get_nowaitコールを使用してください。ワーカープロセスが早期に終了するメッセージを見つけた場合、Cはコードをクリーンアップし、部分的な結果を返す呼び出します。

あなたは* nixのにしている場合はPythonから、あなたのCプログラムでSIGUSR1またはSIGINTのシグナルハンドラを登録信号を送信するためにos.kill使用します。

あなたがそう言った:信号とパイプ。

それほど複雑である必要はありませんが、独自の構造を作成するよりも既存の構造を使用した方がはるかに簡単になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top