呼び出した後のpythonからスレッドを可能にSWIGを使用して生成されたPythonの拡張にコードO / Iをブロック

StackOverflow https://stackoverflow.com/questions/2510696

  •  22-09-2019
  •  | 
  •  

質問

私はSWIGでPython拡張ラッピングに既存のC ++ライブラリ Live555ではに(具体的には、ラッピングRTSPクライアント・インターフェースを)書かれています。拡張子はPythonインタプリタが制御背中を取得したことがない、とすぐに私は図書館のイベントループ関数を呼び出すと、それがシングルスレッドで動作しているときに動作しますが、。私はイベントループを呼び出す前にthreading.Timer権を使用してスケジュールされたタスクを作成するのであれば、そのタスクは、イベントループが始まる一度実行れることは決してありません。この問題を解決するには、私はすべてのPy_BEGIN_ALLOW_THREADS関数呼び出しの周りにCXXファイルラッパー生成SWIG自動で手動Py_END_ALLOW_THREADSdoEventLoop()マクロを追加しました。しかし、今、私はSWIGはコード自体を生成し、手動で任意のコードを変更していないとき(すなわち、スレッドを許可する)同じことをやりたいです。誰もがSWIGに似た何かをやっていますか?

P.S。 - また、私はこの作業を取得する(SIPなどの)他のフレームワークへの切り替えを検討します。私はSWIGインタフェースを書くことは非常に簡単で、本当にだったと私は既存のヘッダーファイルをインクルードしなければならなかったためである任意の他の技術上のSWIGを選択します。

役に立ちましたか?

解決

SWIGはこれを実現する助けにあなたのフックの多くを提供します。

:粗ソリューションは、あなたのニーズに十分であれば、私が過去にやった一つのことは、私の.swigファイル内でこのようなものを入れています
%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

この(A-B)はGILのロック/アンロックを有するものコールを飾るために、エラー処理ロジックのいくつかの種類のC関数呼び出しを装飾するためのSWIG機能を使用します。何の詳細については、SWIGのドキュメントにおける%例外を持つ例外処理を参照してください。ここで起こっています。

scroll top