Django多进程问题
我有一个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?我需要一些方法来合并不同进程中的更改。
一个解决方案是创建一个进程间锁对象,但这样的话我就只能顺序执行视图,不能同时执行,所以我需要帮助。
1 个回答
1
如果你需要同时有很多人访问数据库,SQLite就不是一个好的选择。建议你换用其他的关系型数据库,比如MySQL或PostgreSQL。同时,也要注意get_or_create这个功能可能会有一些不稳定的问题。
关于上面提到的链接,还有第二种解决方案,就是使用READ COMMITED隔离级别,而不是REPEATABLE READ。不过这种方法测试得比较少(至少在MySQL中),所以可能会有更多的错误或问题。