ブロッキング操作 (選択) を実行し、着信メッセージを処理する C 関数をラップしています。私の理解では、C 関数がブロックされる場合、他のスレッドの実行を許可しながらそれを呼び出す正しい方法は次のとおりです。
Py_BEGIN_ALLOW_THREADS
blocking_function();
Py_END_ALLOW_THREADS
ただし、この関数がパラメーターとしてコールバック ポインターを受け取ることがあります。このコールバックは、C 関数によって前処理された受信メッセージを処理する際に呼び出されます。このコールバックを を呼び出す関数にラップすることに成功PyEval_CallObject()
し、Python コールバックを渡すことができました。
スレッドのサポートを追加しているので、同時にできるかどうか疑問に思っています:
- このブロッキング操作を呼び出す前に GIL を解放してください。
- このブロッキング操作で安全に Python インタープリターにコールバックします。
これは問題を引き起こしますか?もしそうなら、それを回避する方法はありますか?
ありがとう。