Python GIL:是django save()阻塞?

我的django应用程序将django模型保存到远程数据库.有时保存是突发性的.为了将应用程序的主线程(* thread_A *)从保存多个对象到数据库的时间长度中解放出来,我想到了使用collections.deque将模型对象转移到一个单独的线程(* thread_B *)并且有* thread_B *按顺序保存它们.

但我不确定这个计划. save()返回新数据库条目的id,因此只有在数据库响应后才会“结束”,这是在事务结束时.

django.db.models.Model.save()是否真的阻止GIL明智并在事务期间释放其他python线程?

解决方法:

Django的save()对GIL没什么特别的.实际上,在Python代码中几乎没有任何关于GIL的功能 – 当它执行时,线程必须保存GIL.

在save()中只有两种方式可以释放GIL:

> Python决定切换线程(在sys.getcheckinterval()指令之后)
> Django调用实现的数据库接口例程来释放GIL

第二点可能是您正在寻找的 – 执行SQL COMMIT并在执行期间,SQL后端释放GIL.但是,这取决于SQL接口,我不确定流行的实际上是否发布了GIL *.

而且,save()不仅仅运行一些UPDATE / INSERT语句和一个COMMIT;它在Python中做了大量的簿记,它必须持有GIL.总之,我不确定你是否会从将save()移动到另一个线程中获得任何收益.

更新:从查看源代码,我了解到sqlite模块和psycopg在调用数据库例程时都会释放GIL,我猜其他接口也是如此.

上一篇:Python zipfile在写入时会挂起


下一篇:[python] GIL全局解释器锁