2010-04-21 28 views
35

Django'da sadece bir bellekte bir değişken saklamak için basit ama önerilen bir yol arıyorum. Apache yeniden başlatıldığında veya Django geliştirme sunucusu yeniden başlatıldığında, değişken 0'a sıfırlanır. Daha özel olarak, her model örneğinde (veritabanı kaydı) belirli bir eylemin kaç kez gerçekleştiğini saymak istiyorum, ancak performans nedenleriyle Bu sayıları veritabanında saklamak istiyorum. Sunucu yeniden başlatıldıktan sonra sayımların kaybolup gitmemesi umurumda değil. Ancak sunucu dolduğunda, bu sayımların Django kabuğu ve web arayüzü arasında tutarlı olmasını istiyorum ve her model örneğinde eylemin kaç kez gerçekleştiğini geri döndürmek istiyorum.Python Django Global Değişkenler

Değişkenlerin bir kullanıcı veya oturumla ilişkilendirilmesini istemiyorum, çünkü bu sayıları giriş yapmadan iade etmek isteyebilirim (ve kullanıcının ne yapması önemli değil sayımların tutarlı olmasını istiyorum). Küresel bir değişken açıklıyor muyum? Eğer öyleyse, Django'da nasıl kullanabilirim? Urls.py, settings.py ve models.py gibi dosyaların, her sunucu başlangıcında yalnızca bir kez çözümlendiğini fark ettim. Bu, değişkenlerimi bu dosyalardan birinde bildirmem gerektiği anlamına mı geliyor? Ya da bir şekilde bir model özniteliğinde saklamam gerekir (sunucu çalıştığı sürece etrafa yapıştığı sürece)? Bu muhtemelen kolay bir soru, ama Django'da nasıl yapıldığından emin değilim.

Herhangi bir yorum veya öneri çok takdir edilmektedir. sayesinde Joe

+0

Önbelleğe alınan dokümanlar, biraz 'önbelleğe alınmış bir sayfa' merkezlidir. Sunucu değişkenleri için kullanmayla ilgili ayrıntılar için 'düşük seviyeli' seçeneğine geçin: https://docs.djangoproject.com/en/1.3/topics/cache/#the-low-level-cache-api –

+0

Bu size yardımcı olabilir: Bunları depolamak için [https://github.com/andres-torres-marroquin/django-system-globals](https://github.com/andres-torres-marroquin/django-system-globals) –

cevap

24

Sen genel değişkenleri bildirmek değil gerekir. Doğru yapıldığında ayarlar (sabitler) tamam. Ancak değişkenler paylaşılan hiçbir şeyle mimarisini ihlal ediyor ve çok fazla sorun yaratabilir. (en iyi durumda tutarsız olurlar)

Bu istatistikleri önbellekte saklıyorum. Yeni incr() ve decr() yöntemleri sayma için uygundur

(Aslında ben veritabanında depolamak istiyorum ama sen performans üzerinde çok olumsuz bir etkisi olacak inanmak açıkça, bu yüzden ...). Daha fazla bilgi için bkz. docs.

+3

+1 önbellek. –

+0

Bu yaklaşımı beğeniyorum ve bunu uyguluyorum.Şu anda Django geliştirme sunucusundaki önbellek arka planı için localmem kullanıyorum ve sitemdeki çeşitli web sayfalarına göz attıktan sonra sayımların devam etmediğini fark ettim. (Hangi zamanda django geliştirme sunucusunu yeniden başlatmamıştım) Bunun için birden fazla nedenin olabileceğini anlıyorum. (Sonunda memcached kullanacağım). Sadece localmem önbellek/django geliştirme sunucusunun önbelleğe alınmış değerleri uzun süre beklemediğini veya bir şekilde bir yapılandırma ayarına sahip olup olmadığını merak ediyorum. –

+0

@Joe: Membran gibi uygun bir önbellek arka ucunun yokluğunda daima db önbellek kullanırım. Sadece emin olmak için. Bu, "performans sorunlarıyla ilgili endişe verici olana kadar" ve "optimize etmeden önce ölçmek" ile birlikte gider. – muhuk

54

Neden bir neden global değişkenleri belirtmelidir? O_o. Sadece bir propagandaya benziyor. Yazar ne istediğini ve hangi yan etkilerin olacağını bilirse, neden olmasın. Belki sadece hızlı bir deney.

Sayacınızı sınıfı -member olarak bildirebilirsiniz. Sonra yarış durumu ile başa çıkmak için başka bir iş parçacığı, başka bir iş parçacığı ile çalışıyorsa bekleyecek bir yöntem eklemeniz gerekir. Böyle bir şey:

import threading 

class MyModel(ModelBase): 
    _counter = 0 
    _counter_lock = threading.Lock() 

    @classmethod 
    def increment_counter(cls): 
     with cls._counter_lock: 
      cls._counter += 1 

    def some_action(self): 
     # core code 
     self.increment_counter() 


# somewhere else 
print MyModel._counter 

ancak unutmayın: Tek bir süreçte uygulamanızı olması gerekir. Bu nedenle, uygulamayı Apache kapsamında dağıttığınız takdirde, birçok iş parçacığı oluşturmak için yapılandırılmış olduğundan emin olun. ./manage.py run ile deneme yapıyorsanız hiçbir işlem yapmanız gerekmez.

+1

Bu tam olarak istediğim şey. Test amaçlı her talep için artırılacak bir seri kimlik oluşturmam gerekiyor. Gerçek sistemde, kimlik harici API'den geliyor. – k4ml

+2

Bu oyuncak projeler için uygulanabilir bir yaklaşım olabilir. Ancak, bu sınıfı kullanmaya başladığınızda, uygulamanızın ölçeklenebilir olmadığını garanti ettiniz. Önbellek alt sistemine sahip olmamızın bir nedeni var. – muhuk

+1

Bu yaklaşımı, bir istemciyi bir makine hizmetine tanıtmak için kullandım, web sunucumu yavaşlattığımda her an başlatıyorum ... – thrantir

İlgili konular