我正在構建使用遠程數據庫的應用程序 - 它將類型A 的對象保存到數據庫,並從數據庫中讀取B 類型的對象。用於保存Django模型的單獨線程
由於saving models has the potential to block and release the GIL和應用程序不使用保存的對象本身,我想將呼叫移動到.save()
到一個單獨的線程。
我知道Django一般不是線程安全的。所以我的問題是 - 在查詢類型B的對象時可以有任何問題,而另一個線程保存類型A的對象?
我正在構建使用遠程數據庫的應用程序 - 它將類型A 的對象保存到數據庫,並從數據庫中讀取B 類型的對象。用於保存Django模型的單獨線程
由於saving models has the potential to block and release the GIL和應用程序不使用保存的對象本身,我想將呼叫移動到.save()
到一個單獨的線程。
我知道Django一般不是線程安全的。所以我的問題是 - 在查詢類型B的對象時可以有任何問題,而另一個線程保存類型A的對象?
這實際上並沒有回答這個問題,但我認爲你最好設置一個消息隊列系統並使用另一個進程來處理消息。
不是保存,而是將新的/修改的對象放置在本地存儲中(GAE任務隊列或Amazon SQS服務是最好的,但任何類型的本地存儲都可以),並對其進行處理。
但是,基本上,您正在實現數據庫複製方案(即使使用線程,本地存儲是內存),因此可能應該考慮實際使用全功能複製。
最簡單的方法是使用ztask將它卸載到單獨的進程。
from django_ztask.decorators import task
@task()
def delayed_save(obj):
obj.save()
...
your_object.something = "something"
delayed_save.async(your_object)