Skip to main content
 首页 » 编程设计

python之django多进程问题

2025年05月04日2152php

我有 django 应用程序,通过 fastcgi 在 lighttpd 下运行。 FCGI 运行脚本如下所示:

python manage.py runfcgi socket=<path>/main.socket 
    method=prefork \                                                                                                     
    pidfile=<path>/server.pid \                                                                                                                                         
    minspare=5 maxspare=10 maxchildren=10 maxrequests=500 \ 

我使用 SQLite。所以我有 10 个进程,它们都使用同一个数据库。接下来我有 2 个观点:

def view1(request) 
    ... 
    obj = MyModel.objects.get_or_create(id=1) 
    obj.param1 = <some value> 
    obj.save () 
 
def view2(request) 
    ... 
    obj = MyModel.objects.get_or_create(id=1) 
    obj.param2 = <some value> 
    obj.save () 

如果这个 View 在两个不同的线程中执行,有时我会在数据库中获取 MyModel 实例,id=1 并更新 param1 或 param2(但不是两者)——这取决于哪个进程是第一个。 (当然在现实生活中 id 会改变,但有时 2 个进程使用相同的 id 执行这​​两个 View )

问题是:我应该怎么做才能获得具有更新的 param1 和 param2 的实例?我需要一些东西来合并不同流程中的更改。

一个决定是创建进程间锁定对象,但在这种情况下,我将获得序列执行 View ,它们将无法同时执行,所以我寻求帮助

欺骗 Django: How can I protect against concurrent modification of data base entries

请您参考如下方法:

如果你需要这样的并发访问数据库,SQLite 不是一个好的选择。 我建议切换到其他一些 rdbms,比如 MySQL 或 PostgreSQL, 还要考虑 get_or_create 的脆弱性:

How do I deal with this race condition in django?

关于上面的链接,该问题还有第二种解决方案 - 使用 READ COMMITED 隔离级别,而不是 REPEATABLE READ。但它的测试较少(至少在 MySQL 中),因此可能存在更多错误/问题。