1

SWIGで既存のC++ライブラリlive555をラップする(具体的にはRTSPクライアントインターフェイスをラップする)Python拡張機能を作成しました。拡張機能はシングルスレッドで操作されている場合は機能しますが、ライブラリのイベントループ関数を呼び出すとすぐに、Pythonインタープリターが制御を取り戻すことはありません。したがってthreading.Timer、イベントループを呼び出す直前を使用してスケジュールされたタスクを作成した場合、イベントループが開始されると、そのタスクは実行されません。この問題を修正するために、すべての関数呼び出しの周りにSWIG自動生成ラッパーcxxファイルにマクロを手動で追加Py_BEGIN_ALLOW_THREADSしました。しかし、今は、SWIGがコード自体を生成するときに同じことを実行し(つまり、スレッドを許可し)、コードを手動で変更しないようにします。SWIGで似たようなことをした人はいますか?Py_END_ALLOW_THREADSdoEventLoop()

PS-これを機能させるには、他のフレームワーク(SIPなど)に切り替えることも検討します。SWIGインターフェイスの作成は非常に簡単で、既存のヘッダーファイルをインクルードするだけでよいため、他のテクノロジよりもSWIGを選択しました。

4

1 に答える 1

5

SWIGは、これを実現するのに役立つたくさんのフックを提供します。粗い解決策で十分な場合は、過去に私が行ったことの1つとして、次のようなものを.swigファイルに入れます。

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

これは、GILロック解除/ロックでそれらの呼び出しを装飾するために、ある種のエラー処理ロジックでC関数呼び出しを装飾するためのSWIG機能を使用します。ここで行われていることの詳細については、SWIGドキュメントの%exceptionを使用した例外処理を参照してください。

于 2010-03-24T23:22:06.637 に答える