我有django應用程序,通過fastcgi在lighttpd下運行。 FCGI運行腳本如下所示:Django多進程問題
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()
,如果這個觀點在兩個不同的線程執行,有時我得到爲MyModel例如在DB與ID = 1和更新或者參數1或參數2(但不能同時) - 這取決於其過程是第一個。 (當然在現實生活中ID變化,但有時2個進程使用相同的ID執行這兩個視圖)
問題是:我應該怎麼做更新param1和param2的實例?我需要一些東西來合併不同進程中的更改。
一個決定是創建進程間鎖定的對象,但在這種情況下,我會得到順序執行的意見,他們將不能夠同時執行,所以我要求幫助
DUPE的Django: How can I protect against concurrent modification of data base entries
SQLite通常被認爲不適合作爲測試環境之外的後端;遷移到PostgreSQL或MySQL將成爲阻力最小的路徑。 – 2010-05-26 18:21:40
[Django:如何防止數據庫條目的併發修改]的可能重複(http://stackoverflow.com/questions/320096/django-how-can-i-protect-against-concurrent-modification-of-數據庫條目) – 2010-05-26 18:23:46
嗯...可能是這個討論可以是有用的。我可以在我的模型中添加時間戳字段並在保存前更新它。成功更新意味着沒有其他線程/進程沒有改變我的對象,所以我可以調用save方法。但是,如果更新失敗,這意味着其他線程或進程已經改變了它,我應該從數據庫重新獲取並嘗試合併更改。我對嗎? P.S:但是很奇怪,Django對解決這些問題沒有任何幫助......所有的開發人員都可以發明自己的解決方案嗎?這很奇怪 – iKiR 2010-05-27 05:41:18