【发布时间】:2011-03-01 18:59:45
【问题描述】:
我正在包装一个 C 函数,该函数执行阻塞操作(选择),然后处理传入消息。我的理解是,当一个 C 函数要阻塞时,在允许其他线程运行的同时调用它的正确方法是:
Py_BEGIN_ALLOW_THREADS
blocking_function();
Py_END_ALLOW_THREADS
然而,这个函数碰巧将一个回调指针作为参数。在处理由 C 函数预处理的传入消息时调用此回调。我已经成功地将这个回调封装在一个调用 PyEval_CallObject() 的函数中,允许我向它传递一个 Python 回调。
现在我正在添加线程支持,我想知道是否可以同时:
- 在调用此阻塞操作之前释放 GIL。
- 让这个阻塞操作安全地回调到 python 解释器中。
这会导致问题吗?如果是这样,有没有办法解决它?
谢谢。
【问题讨论】:
-
似乎正确的方法可能是在调用
PyEval_CallObject的处理程序中重新捕获 GIL。但是,这意味着将保存的PyThreadState转发出去,这似乎有点棘手!
标签: python gil python-multithreading python-bindings