7

SWIG を使用してラップし、Python で使用する C++ で記述されたライブラリがあります。一般に、いくつかのメソッドを持つ 1 つのクラスがあります。問題は、これらのメソッドの呼び出しに時間がかかることです。アプリケーションがハングする可能性があります (これらのメソッドを呼び出すときに GIL は解放されません)。だから私の質問は:

これらのメソッド呼び出しのために GIL を解放する最も簡単な方法は何ですか?

(Cライブラリを使用した場合、これを追加のCコードでラップできることは理解していますが、ここではC++とクラスを使用しています)

4

3 に答える 3

9

本当の問題は、SWIG が十分に文書化されていないことです (検索に changelog を使用するヒントを見ました ;))。

OK、SWIG でインライン関数を実行し、マクロを使用して GIL を解放/取得できることがわかりました。次のようになります。

%inline %{
    void wrappedFunction(OriginalObject *o, <parameters>) {
    Py_BEGIN_ALLOW_THREADS
    o->originalFunction(<parameters>);
    Py_END_ALLOW_THREADS
}
%}

この関数は元の C++ にはありませんが、python モジュールで使用できます。これは(ほぼ)まさに私が望んでいたものです。(私が望むのは、Pythonデコレータのように元のメソッドをラップすることです)

于 2009-10-16T14:21:01.860 に答える
9

SWIGが何かわからないので、とにかく答えを試みます:)

次のようなものを使用して、GIL を解放/取得します。

class GILReleaser {
    GILReleaser() : save(PyEval_SaveThread()) {}

    ~GILReleaser() {
        PyEval_RestoreThread(save);
    }

    PyThreadState* save;
};

選択したコード ブロックで、RAII を使用して GIL を解放/取得します。

{
    GILReleaser releaser;
    // ... Do stuff ...
}
于 2009-10-16T09:12:03.067 に答える