gpt4 book ai didi

python GIL : is django save() blocking?

转载 作者:太空狗 更新时间:2023-10-30 02:34:02 25 4
gpt4 key购买 nike

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

但是我不确定这个方案。 save() 返回新数据库条目的 id,因此它仅在数据库响应后“结束”,即事务结束。

django.db.models.Model.save() 是否真的阻塞 GIL -wise 并在交易期间释放其他 python 线程?

最佳答案

Django 的 save() 对 GIL 没有任何特殊作用。事实上,在 Python 代码中几乎没有什么可以用 GIL 做的——当它被执行时,线程必须持有 GIL。

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

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

第二点可能是您要查找的内容——执行了 SQL COMMIT,并且在该执行期间,SQL 后端释放 GIL。但是,这取决于SQL接口(interface),我不确定流行的是否真的发布了GIL*。

此外,save() 所做的不仅仅是运行一些UPDATE/INSERT 语句和COMMIT;它在 Python 中做了很多簿记工作,其中它必须保存 GIL。总而言之,我不确定将 save() 移动到不同的线程是否会给您带来任何好处。


更新:通过查看源代码,我了解到 sqlite 模块和 psycopg 在调用数据库时都会释放 GIL例程,我想其他接口(interface)也做同样的事情。

关于 python GIL : is django save() blocking?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com