2010-06-29 17 views
5

bir Django görünümünde subprocess.Popen kullanarak bir python komut dosyası() çalıştırılıyor ama var bu sorunu çözmek gibi olamaz. Django uygulamamın görünümünde bir python betiği yürütmek istiyorum. Bir django yönetim komutunun içinde çalıştırmak istediğim kodu koydum, böylece python manage.py command-name komut satırından erişilebilir. Daha sonra bu komutu subprocess.Popen("python manage.py command-name",shell=True) kullanarak çalıştırmayı denedim.Ben biraz etrafına baktım

Ancak, bu komutun yürütülmesi biraz zaman alabilir, bu nedenle görünümün devam etmesini ve komut dosyasının arka planda yürütülmesini istiyorum. subprocess.Popen yalnız komut bitene kadar asmak için görünümü neden görünmektedir kullanarak, bu yüzden (another SA sorusuna şu) bir iş parçacığı kullanarak çalıştı: o zaman

class SubprocessThread(threading.Thread): 
def __init__(self, c): 
    self.command = c 
    self.stdout = None 
    self.stderr = None 
    threading.Thread.__init__(self) 

def run(self): 
    p = subprocess.Popen(self.command, 
         shell=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

    self.stdout, self.stderr = p.communicate() 

ve yürütme:

t = SubprocessThread("python manage.py command-name") 
t.setDaemon(True) 
t.start() 
t.join() 

Ancak, görünüm hala askıda kalıyor: imlecin meşgul bir sembolü var ve sayfada AJAX yüklenmiyor. Aksi takdirde, sayfanın html'i ince yükler ve iş parçacığı çağrısı normal bittiğinde (komut tamamlanmadan) görünümde komutlar gibi görünür. Birisi bana yardım edebilir mi? Komut dosyasını, görünümü veya AJAX çağrılarını tutmadan, kendi işini yürütmesini ve yapmasını istiyorum.

+0

Düzenli benzer bir model kullanmak gerçek zamanlı operasyon üzerinde duruldu ve ben düzenli bir şey dönmek için unutmak edilir görüntülemeyi, tarayıcıyı askıya almayı. Daha sonra, bir HttpResponse'yi geri almayı unuttuğum sırada alt yükleniciyi suçluyorum. Şunu kontrol et! – Dunatotatos

cevap

3

Belki celery

kereviz dağıtılan mesajı geçirmek üzerine dayalı bir görev kuyruğu/iş kuyruğu olduğunu kullanmalıdır. (a `thread` zaman görünümü işlevi çıkar öldürdü, çünkü bir` subprocess` ile)

1

Benzer bir şeyi uygulamaya çalışırken çok fazla zaman harcadım ama aynı sorunları yaşadım. Sonunda işi halletmek için vazgeçtim ve bir fasülye kuyruğu uygularım.

http://kr.github.com/beanstalkd/

Django görünümünde sıraya bir kimliği koymak ve sonra (supervisord tarafından izlendi) tüketici çalıştırmak için bir yönetim komutu var.

Bir kuyruk kullanmak, birden fazla tüketiciye genişleyebilir ve yükü daha iyi yönetebilmenizi sağlar (gerektiğinde işi kaybetmeden müşteriyi duraklatmak gerekir).

İlgili konular