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. boost python C++関数が別の関数エラーを呼び出す
- 6. JNAからC関数呼び出し
- 7. JNIでCの複数のスレッドからjava関数を呼び出すとどうなりますか?
- 8. 複数のスレッドからConsole.WriteLineを呼び出す
- 9. 複数のスレッドからaccept()を呼び出す
- 10. 複数のスレッドからjava.util.Collections.shuffle()を呼び出す?
- 11. クラスBのスレッドからクラスAの関数を呼び出す[C#]
- 12. Python:関数からifステートメントに変数を呼び出す
- 13. TBB C++マルチスレッドエラー:呼び出しに一致する関数がありません
- 14. 関数呼び出しから関数呼び出し名を抽出する
- 15. C関数呼び出し
- 16. C++からlibファイルのc関数を呼び出す
- 17. C++コードから目的のC関数を呼び出す
- 18. このDLL関数をC++/Cから呼び出す方法
- 19. LinuxのC++ライブラリからC++関数を呼び出す
- 20. C++の関数をC#から呼び出す
- 21. C++からC#関数を呼び出していますか?
- 22. スレッドは関数(Python)を呼び出さない
- 23. Python用ライブラリ:PythonプログラムからC++関数を呼び出す方法は?
- 24. print文からPythonの関数を呼び出せますか?
- 25. CからC++関数を呼び出す方法#
- 26. C++ DLLからC#関数を呼び出す
- 27. C#からC++ exe関数を呼び出す
- 28. SQL Server 2008からアンマネージC/C++ DLL関数を呼び出す
- 29. 関数を含むファイルのコレクションからPython関数を呼び出す
- 30. C#のlibyahoo2関数を呼び出す