2010-05-10 54 views
0

我正在尋找一種方法來與使用Django ORM的守護進行異步數據處理。但是,ORM不是線程安全的;嘗試從線程中檢索/修改django對象並非線程安全的。所以我想知道實現異步的正確方法是什麼?異步守護進程處理/與Django的ORM交互

基本上我需要完成的是獲取數據庫中的用戶列表,查詢第三方api,然後爲這些用戶更新用戶配置文件行。作爲守護進程或後臺進程。按用戶順序執行此操作很簡單,但根本無法擴展。如果守護進程正在通過ORM檢索和更新用戶,那麼如何實現同時處理10-20個用戶?我會用一個標準的線程/隊列系統,這一點,但你不能絲線猶如相互作用

models.User.objects.get(id=foo) ...

的Django本身是一個異步處理系統,使異步調用ORM(?)每個請求,所以應該有做一個辦法嗎?到目前爲止,我還沒有在文檔中找到任何內容。

乾杯

回答

2

如果你的異步處理是在它自己的進程正在做,那麼線程安全並不是一個問題,因爲你的線程不共享的地址空間,所以它們不能互相干擾。他們每個人都有自己的模型對象副本。併發將由數據庫用事務來控制。所以你很好。

如果您要在Web服務器的某個進程中產生一個線程來執行異步業務,那麼您需要鎖定所有不是線程安全的API調用。

from threading import Lock 

Apache使用多個進程通過fork()系統調用來處理連續的Web請求。這就是爲什麼Django的ORM API不需要線程安全的原因。我相信Apache可能能夠使用線程而不是進程,但它認爲該功能必須被禁用才能使用Django。

http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95

順便說一句,你明白一個線程與進程的區別?其種類很重要。

3

看看celery。我想這會解決你的問題。它使用多處理模塊。它需要一個(非常)小的設置,但是在縮放方面有很大幫助。