Python C APIの学習プロセスとして、tbb parallel_forに渡されたファンクタ内のPython関数を呼び出そうとしています。 関数を呼び出す操作で、Pythonプロセスのインスタンスがクラッシュします。 スレッドセーフではありません。私はリストから項目を取得し、関数の引数として渡された項目を持つPython関数を呼び出します。最後に、私はその項目をリストに戻しました。私は間違って何をしたのですか?Python C、tbb、複数のスレッドから関数を呼び出す
1
A
答えて
1
C++からPython関数を呼び出すときにグローバルインタープリタロック(GIL)を取得するのを忘れた可能性があります。例えば、swigを使ってPython implements thisためTBBモジュール:
class PyCaller : public swig::SwigPtr_PyObject {
public:
using swig::SwigPtr_PyObject::SwigPtr_PyObject; // gets constructors
void operator()() const {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
PyObject* r = PyObject_CallFunctionObjArgs((PyObject*)*this, NULL);
if(r) Py_DECREF(r);
SWIG_PYTHON_THREAD_END_BLOCK;
}
};
// Usage:
tbb::task_group tg;
void enqueue(PyObject *c) {
tg.run(PyCaller(c));
}
そして、あなたはSWIGがそれをどのように実装するかを見ることができます - here。より高速な機能を作り、彼らはコンパイルされた関数からGILを取り除くように並列に実行するためにPythonの機能を有効に両方のNumbaの@cfunc(nopython=True)
デコレータとCythonのnogil
属性を使用することを含んで考慮すべき
その他のオプション。
関連する問題
- 1. PythonスレッドでTBB 'parallel_for'を呼び出す
- 2. Pythonの複数のスクリプトからの関数を呼び出す
- 3. NumPyのC API関数を複数のスレッドから呼び出すことの意義は何ですか?
- 4. PostgreSQLのPL/Python関数からplpgsql関数を呼び出す
- 5. gdb-pythonメソッド内からC関数を呼び出す方法
- 6. Android関数のC++関数からC関数を呼び出すJNI/NDKコード
- 7. boost python C++関数が別の関数エラーを呼び出す
- 8. JNIでCの複数のスレッドからjava関数を呼び出すとどうなりますか?
- 9. JNAからC関数呼び出し
- 10. 複数のスレッドからjava.util.Collections.shuffle()を呼び出す?
- 11. 複数のスレッドからaccept()を呼び出す
- 12. 複数のスレッドからConsole.WriteLineを呼び出す
- 13. クラスBのスレッドからクラスAの関数を呼び出す[C#]
- 14. C++:複数のクラスの同じ関数を呼び出す
- 15. 関数を呼び出す複数回
- 16. TBB C++マルチスレッドエラー:呼び出しに一致する関数がありません
- 17. Python:関数からifステートメントに変数を呼び出す
- 18. 関数呼び出しから関数呼び出し名を抽出する
- 19. C++コードから目的のC関数を呼び出す
- 20. C++の関数をC#から呼び出す
- 21. C++からlibファイルのc関数を呼び出す
- 22. AndroidのCファイルからC++関数を呼び出す
- 23. このDLL関数をC++/Cから呼び出す方法
- 24. CコードからC++関数を呼び出す際の問題
- 25. LinuxのC++ライブラリからC++関数を呼び出す
- 26. C関数呼び出し
- 27. C++からC#関数を呼び出していますか?
- 28. ある関数から別の関数に変数を呼び出す(Python)
- 29. Node.js複数の関数呼び出し
- 30. スレッドは関数(Python)を呼び出さない