Django多进程问题

2 投票
1 回答
2249 浏览
提问于 2025-04-15 23:12

我有一个Django应用程序,它通过FastCGI在lighttpd服务器上运行。处理FastCGI的脚本看起来是这样的:

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

我使用的是SQLite数据库。所以我有10个进程,它们都在使用同一个数据库。接下来,我有两个视图:

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 ()

如果这两个视图在两个不同的线程中执行,有时候我会在数据库中得到一个id为1的MyModel实例,并且只更新了param1或param2(但不会同时更新两个参数)——这取决于哪个进程先执行。(当然在实际情况中id会变化,但有时两个进程会用相同的id执行这两个视图)

我的问题是:我该怎么做才能让实例同时更新param1和param2?我需要一些方法来合并不同进程中的更改。

一个解决方案是创建一个进程间锁对象,但这样的话我就只能顺序执行视图,不能同时执行,所以我需要帮助。

重复问题:Django:如何防止数据库条目的并发修改

1 个回答

1

如果你需要同时有很多人访问数据库,SQLite就不是一个好的选择。建议你换用其他的关系型数据库,比如MySQL或PostgreSQL。同时,也要注意get_or_create这个功能可能会有一些不稳定的问题。

我该如何处理Django中的竞争条件?

关于上面提到的链接,还有第二种解决方案,就是使用READ COMMITED隔离级别,而不是REPEATABLE READ。不过这种方法测试得比较少(至少在MySQL中),所以可能会有更多的错误或问题。

撰写回答