2016-06-11 109 views
0

有沒有辦法在django的模型上調用save(),而不需要等待數據庫的響應?
你可以考慮這個異步,雖然我需要更少,因爲異步調用通常會給你回調 - 我不需要這裏。
所以基本上我想要的 -Django無阻塞保存?

SomeModel.objects.bulk_create([list of objects ]),每天說1000個對象,
沒有這一行擋住了我的代碼。我將在我的代碼中的這些行中沒有用處。
我在尋找簡單的東西,包如芹菜似乎提供比這樣更多..

+1

比較芹菜和django是蘋果和桔子的比較。 Django旨在確保所有數據都能正確保存,或在不能時拋出異常。你真的在把頭轉向django。但是,你仍然可以將這份工作交給芹菜,並且完成它。 – e4c5

+0

事情是我需要在這個視圖中記錄每次訪問的一些細節,我不希望它因爲這個插入而變得緩慢。對於如此簡單的任務,芹菜似乎太複雜了太多的依賴關係了。 – user3599803

回答

2

截至2016年,Django是一個Web框架的工作(就目前而言,如果我們忽略channels)採取了HTTP請求「作爲參數」並儘快返回HTTP響應。

這種架構意味着框架中沒有異步操作的概念。如果你想拖延儲蓄和返回響應用戶無需等待,您可以:

  • 或者運行其他線程/異步模塊(可與繁瑣數據庫事務...);
  • IronWorker這樣的服務,它允許您排隊操作以運行異步a.s.a.p;
  • celery,這可能會爲您的情況帶來太多的功能,但會比一些自制解決方案做得更好。
+0

太糟糕了。我確實記得讀過其他dbs,如mongoDB確實有「插入和繼續」選項的地方。所以我可能只是爲此而使用它。 – user3599803

0

rq(Redis隊列)是異步操作的另一種選擇(除了那些Maxime Lorant在他的回答中提到的)。它使用Redis作爲代理(擁有任務的中間人),因此如果您已經在使用Redis,或者如果您想將其添加到項目中,則應考慮此問題。這是一個不錯的簡單解決方案,比芹菜簡單得多。還有一個簡單的應用程序,可以爲rq提供django集成。

更新: 總結評論

django_rq提供啓動工作進程的管理命令(rqworker)。放入隊列中的任何作業都將由此過程執行。您可以爲每個對象發送一個作業到隊列中(作業將是一個在其參數中帶有對象的函數,並且會將該對象保存到數據庫中),或者收集對象列表併發送包含該列表的作業。在第二種情況下,您需要暫時將此列表存儲在某個可能非常棘手的位置。

使用Redis的臨時商店,我認爲最可靠的方法來做到這一點是序列化對象,JSON,並將其存儲到Redis的列表中的對象(推薦)

。然後定期檢查它的長度和時間長度,可以將作業發送到在其參數中包含此列表的隊列。

使用工人的內存來臨時存儲對象

你也可以使用你的工人的RAM作爲臨時存儲。這可能是由於工作進程有自己的記憶。在這種情況下,主進程(runserver)用一個對象創建一個作業。作業不保存對象,只是將其添加到列表中。您可以繼續將對象附加到此列表。由於作業在工作進程中執行,因此該列表存在於工作人員的內存中。當它具有所需的長度時,則可以保存所有對象。

但想象一下您創建多個工人的情況。在這種情況下,隊列中的每個作業都將由當前的空閒工作人員選取。因此,一些對象將被添加到worker_1的內存列表中,worker_2列表中的一些其他對象等等,並且您將不得不處理與工人一樣多的列表。

+0

django自定義管理命令呢?無法確定如何訪問已經運行的文件 – user3599803

+0

你是什麼意思?你能給出更詳細的解釋嗎? – dimyG

+0

運行一個django命令https://docs.djangoproject.com/en/1.10/howto/custom-management-commands/它將在後臺工作,並將寫入db – user3599803