Python GIL:是django save()阻塞?

Jon*_*han 4 python django multithreading transactions gil

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

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

难道django.db.models.Model.save()真的阻止GIL -wise并释放其他的Python线程的交易?

Fer*_*yer 7

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

GIL只有两种方式可以发布save():

  • Python决定切换线程(在sys.getcheckinterval()指令之后)
  • Django调用一个数据库接口例程,该例程被实现为释放GIL

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

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


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