在什么情况下发布python GIL是安全的



我已经编写了一个运行机器学习推理的C++库。这些推理函数通常每个使用8个线程来优化低延迟(尽管完成推理调用仍可能需要超过100ms(。我使用了std::mutex之类的同步原语来确保库是线程安全的。

我还使用pybind11为这个库编写了python绑定。

当前的问题是,在16核/线程CPU上,并行运行两个推理函数调用是最佳的,从而利用所有16个可用线程。这在C++中是可以的,但在python(带线程(中,由于GIL的原因,一个推理调用最终持有锁,另一个无法并行运行。注意,我知道我可以使用多处理来解决这个问题,但由于我的库的设计,我想使用线程。

因此,当调用C++API函数(在python绑定层中(时,我是否可以释放GIL,因为C++库实现了必要的线程安全性?在发布GIL时,我还需要考虑其他因素吗?

GIL保护每个Python对象。如果您没有访问任何对象,或者它是对您拥有所有权引用的不可变对象的只读访问,则可以释放它。请确保保留对重新获取锁后将使用的任何对象的所有权引用,以免在释放时被破坏。

最新更新