2

PyThreadState現在のスレッドには がないようですので、作成したいと思います。

現在の PyInterpreterState を に渡すにPyThreadState_New(...)はどうすればよいですか、それとも Python からライブラリを呼び出すのではなく、インタープリターを埋め込んでいる (したがって作成した) 場合にのみ行うべきことですか?

4

3 に答える 3

4

マルチスレッドプログラミングをしているのではないかと思います。最近、私は同様の問題を抱えています。次のコードがお役に立てば幸いです。

//in main thread
PyThreadState * mainThreadState = NULL;

Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyThreadState_Get();
PyEval_ReleaseLock();
//in threaded thread
PyEval_AcquireLock();
PyInterpreterState * mainInterpreterState = mainThreadState->interp;
PyThreadState * myThreadState = PyThreadState_New(mainInterpreterState);
PyEval_ReleaseLock();
/*
 * embeded python part 
 * PyEval_CallObject() for example
 */
于 2011-07-07T12:43:07.643 に答える
1

Python 以外で作成されたスレッドから Python にコールバックしようとしている場合は、PyGILState_Ensure() API を使用できます。これにより、現在のスレッドにまだスレッド状態がない場合に、一時的なスレッド状態が作成されます。

詳細については、 http://docs.python.org/c-api/init.html#non-python-created-threadsを参照してください。

Python スレッドから呼び出されたコードで GIL を解放することは、Py_BEGIN(/END)_ALLOW_THREADSマクロを使用することでさらに簡単になります: http://docs.python.org/c-api/init.html#releasing-the-gil-from-extension-code

于 2011-02-14T01:43:58.280 に答える
1

PyThreadStateメインスレッドにa がないことは致命的なエラーであることが判明しました。これは、2 つの異なるバージョンの Python が同時にリンクされていることが原因で発生したため、この質問はやや意味がありません。

于 2011-02-15T09:48:09.930 に答える