2011-10-18 9 views
3

1)Pythonインタプリタを特定の関数から返すときに、Python C APIのプロファイリング関数を使用してキャッチしたいと考えています。Python C API - 実行を停止する(そして後で続ける)

2)Pythonインタプリタを一時停止し、C++プログラムでインタプリタを呼び出した関数に実行を戻し、最後にPythonインタプリタに実行を戻し、停止した後のコード行で開始したい。実行がPythonに属する時代の間にグローバルとローカルの両方を維持したいと思います。

パート1終了しました。パート2は私の質問です。私は何を保存すべきかわからないので、私は実行に戻ることができる、または保存されたデータを与えられた実行に戻る方法。

私はPython APIのドキュメントから降りることができたので、実行中のフレームの一部を保存する必要がありますが、何も見つかりませんでした。いくつかの追加の質問... PyFrameObjectには正確に何が含まれていますか?驚くべきことに、Python APIのドキュメントはそれを決して説明しません。

+0

'SIGSTOP' /' SIGCONT'を使ってみましたか? – Daenyth

+0

私のPythonインタプリタは私のC++プログラムと同じスレッドで実行されています...そのスレッド内で実行を渡し、プロセス全体を停止しないようにしてください...おそらく、SIGSTOPとSIGCONTの影響を完全に理解していないかもしれません私のプログラムで?もしそうなら、説明してください。 – Miles

答えて

2

私があなたの問題を理解していれば、Pythonを呼び出すC++プログラムがあります。 Pythonが関数の実行を終了すると、インタプリタを一時停止し、C++コードがどこで終了したのかを知りたいとします。しばらくして、C++プログラムはPythonに戻ってPythonインタプリタで途切れた部分を取り除かなければなりません。

1つのスレッドでこれを非常に簡単に行うことはできません。あなたは、スタックは次のようになりインタプリタを一時停止する前に:インタプリタを一時停止するには

[ top of stack ] 
[ some interpreter frames ] 
[ some c++ frames ] 

、あなたは通訳フレームをオフに保存し、一番上のC++フレームに戻ってジャンプする必要があります。ポーズ解除するには、インタプリタのフレームを復元し、スタックを上に飛び越して最後まで飛ばします。ジャンプは実行可能ですが(http://en.wikipedia.org/wiki/Setjmp.h参照)、スタックの保存と復元は難しくなります。私はこれを行うためのAPIを知らない。

ただし、2つのスレッドでこれを行うことができます。あなたのC++プログラムの最初に作成されたスレッド(スレッド1と呼ばれます)はC++コードを実行し、スレッド2を作成してPythonインタプリタを実行します。

最初は(C++コードを実行していたとき)、スレッド1が実行されており、スレッド2はブロックされています(例えば、条件変数の場合はhttps://computing.llnl.gov/tutorials/pthreads/を参照)。インタプリタ・スレッド1が実行されたり、ポーズ解除されたりすると、条件変数に信号が送信され、それを待機します。これにより、スレッド2(インタープリタを実行する)が起動し、スレッド1がブロックされます。インタープリタが一時停止する必要があるとき、スレッド2は条件変数を通知し、それを待ちます(スレッド2ブロック、スレッド1が起動します)。スレッド間であなたの心臓のコンテンツにバウンスすることができます。お役に立てれば。

+0

ありがとう!私はあなたの答えの中で私が理解していなかったボキャブをグーグルで探そうとしたので、今私はあなたが意味するものを得ます。魅力のように働いた。 – Miles

関連する問題