Я обертываю функцию C, которая выполняет операцию блокировки (выбор), а затем обрабатывает входящие сообщения.Насколько я понимаю, когда функция C собирается блокировать, правильный способ ее вызова при одновременном запуске других потоков:
Py_BEGIN_ALLOW_THREADS
blocking_function();
Py_END_ALLOW_THREADS
Однако бывает, что эта функция принимает в качестве параметра указатель обратного вызова,Этот обратный вызов вызывается при обработке входящего сообщения, которое предварительно обрабатывается функцией C.Я успешно завернул этот обратный вызов в функцию, которая вызывает PyEval_CallObject()
, что позволяет мне передать ему обратный вызов Python.
Теперь, когда я добавляю поддержку потоков, мне интересно, возможно ли это одновременно:
- Перед вызовом этой операции блокировки отпустите GIL.
- Пусть эта операция блокировки безопасно перезвонит в интерпретатор python.
Будет ли это вызывать проблемы?Если так, есть ли способ обойти это?
Спасибо.