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线程中的交易?
Django save()对GIL没什么特别之处.实际上,在Python代码中几乎没有任何关于GIL的功能 - 当它执行时,线程必须保存GIL.
GIL只有两种方式可以发布save():
sys.getcheckinterval()指令之后)第二点可能是您正在寻找的 - COMMIT执行SQL 并在执行期间,SQL后端释放GIL.但是,这取决于SQL接口,我不确定流行的实际上是否发布了GIL*.
而且,save()不仅仅是运行一些UPDATE/INSERT语句和一个COMMIT; 它在Python中做了大量的簿记,它必须持有GIL.总之,我不确定你会从移动save()到另一个线程中获得任何收益.
更新:从查看源代码,我了解到sqlite模块和psycopg调用数据库例程时都会释放GIL,我猜其他接口也是这样做的.
| 归档时间: |
|
| 查看次数: |
1876 次 |
| 最近记录: |