我正在封裝一個C函數,它執行阻塞操作(select),然後處理傳入的消息。我的理解是,當一個C函數是要阻止,正確的方法來調用它同時允許其他線程運行是:是否有可能在C函數之前釋放GIL並阻止並可能回調到Python?
Py_BEGIN_ALLOW_THREADS
blocking_function();
Py_END_ALLOW_THREADS
然而,碰巧這個功能作爲一個參數的回調指針。調用此回調函數處理由C函數預處理的傳入消息。我已經成功地將此回調包裝在一個調用PyEval_CallObject()
的函數中,允許我將它傳遞給Python回調函數。
現在我加入線程支持,我不知道是否有可能同時向:
- 調用這個阻塞操作之前釋放GIL。
- 讓這個阻塞操作安全地回調到python解釋器中。
這會導致問題嗎?如果是這樣,是否有解決方法?
謝謝。
看來正確的方法可能是重新捕獲我的處理程序中調用「PyEval_CallObject」的GIL。但是,這意味着傳遞保存的'PyThreadState',這看起來有點棘手! – Steve 2011-03-01 19:11:35