【问题标题】:django runserver, skiping/caching? requests when multiple executed at the same timedjango runserver,跳过/缓存?多个同时执行的请求
【发布时间】:2019-10-07 08:41:52
【问题描述】:

当运行 django-admin runserver 并同时执行多个 PATCH 请求时,我看到所有日志,但在调试时只执行了一个。

使用django-admin runserver --nothreading时问题消失了。

我正在使用 Pycharm 调试器,可能是因为 runserver 默认使用 多线程,所以当两个请求同时出现时,会创建第二个线程,而 Pycharm 看不到/调试。所以这就是为什么我无法调试它但我看到了日志。

但第二件事是补丁更新只有一个请求成功,我知道 django-admin runserver 不是针对生产但是否有任何 数据竞争条件?我曾尝试使用 django.db.transaction.atomic 但它没有做出任何改变?

我的初步结论是,如果我们考虑数据库更新,runserver 不是线程保存,所以如果测试多个更新请求,应该使用 --nothreading 标志。

如果有任何帮助/解释,我将不胜感激。

最好, 伊戈尔

附:我没有任何代码,因为我认为它在这里没有任何帮助:

【问题讨论】:

  • 嗨@Alasdair,你是对的--nothreading 只是隐藏了我已经修改我的代码以使用 select_for_update 的问题,谢谢。如果你想请修改你的评论来回答,你解决了我的问题。

标签: django python-3.x multithreading


【解决方案1】:

transaction.atomic() 确保一个块中的所有查询都提交给数据库,或者没有。它不会阻止不同的线程/进程同时修改相同的行。为此,您应该查看锁定或select_for_update

当您使用 gunicornmod_wsgi 之类的东西部署 Django 时,通常会有多个工作线程/线程。因此,如果您在开发中使用 --nothreading,您将隐藏生产中可能出现的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2021-12-24
    相关资源
    最近更新 更多