2009-09-13 19 views
11

Görüş işlevlerimden biri çok uzun bir işlem işi ve açıkça farklı şekilde ele alınması gerekiyor. Kullanıcı uzun bir süre beklemek yerine, sonuçları e-postayla gönderecek olan işleme işini yiyebildiysem ve tamamlamayı beklemeden kullanıcıya isteğinin işlendiğini bildirip, göz atmasına izin verirsem en iyisi olurdu. Os.fork'u kullanabileceğimi biliyorum, ama Django açısından 'doğru yol' olup olmadığını merak ediyordum. Belki de HTTP yanıtını döndürebilirim ve bu işten bir şekilde devam etmektense.Django görünümünde asenkron iş talebi en iyi nasıl yapılır?

+0

Yinelenen olduğunu .com/questions/1352678/it-herhangi-as-make-bir-asynchronous-işlev-çağrı-python-django/ –

+0

Benim kötü, ben çok iyice arandı sanıyordum! –

+0

Maalesef, basit bir cevap var gibi görünmüyor. –

cevap

1

Neden işlem yapmak için thread'u başlatıp yanıt göndermeye başlamıyorsunuz?

10

Bu soruna bir çok çözüm var ve en iyisi iş yükünüzün ne kadar ağır olacağına bağlı.

Hafif bir iş yükünüz varsa, bir "iş" modeli tanımlamak, yeni işleri veritabanına kaydetmek ve daha sonra her defasında tek tek bir komut dosyası çalıştırmak için tek bir komut dosyası çalıştırmak olan django-mailer tarafından kullanılan yaklaşımı kullanabilirsiniz. Veritabanında saklanan işler (tamamlandığında bunları silme). İş planlamasını daha kolay yönetmek için django-chronograph gibi bir şey kullanabilirsiniz

İşi işlemek için bir komut dosyasının nasıl yazılacağını anlama konusunda yardıma ihtiyacınız varsa, yardım için James Bennett'ın makalesine bakın: Standalone Django Scripts.

Çok yüksek bir iş yükünüz varsa, işleri işlemek için tek bir sunucudan daha fazlasına ihtiyacınız olacaktır, yani gerçek bir dağıtma sırası kuyruğu kullanmak istiyorsunuz. Burada bir çok rekabet var, bu yüzden tüm seçenekleri ayrıntılı olarak açıklayamıyorum, ancak Django uygulamaları için kullanmak için iyi bir tane olan celery.

1

Bir çözüm seçmeden önce, işlemin nasıl yürütüleceğini belirlemeniz gerekir. I.e, her kullanıcı için aynı süreçtir, veri aynıdır ve düzenli olarak planlanabilir mi? veya her kullanıcı bir şey ister ve sonuçlar biraz farklı mıdır?

Örnek olarak, veriler her kullanıcı için aynı olacak ve bir programda çalıştırılabiliyorsa, cron kullanabilirsiniz.

Bkz: http://www.b-list.org/weblog/2007/sep/22/standalone-django-scripts/ veya http://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Ancak istekleri anlık olacak ve yüksek yükünü kaldırabilecek ve eşzamansızsa olabilir ölçeklenebilir bir şey gerekiyorsa: ne aslında aradığınız bir mesaj queing sistemidir. Görüşünüz, sıraya göre harekete geçecek bir istek ekleyecektir. taahhüt geçen Nisan ayında olmasına rağmen, Django Kuyruk hizmeti tamamen & piton ve basit django ve proje terk edildi görünüyor:

Django bu uygulamaya birkaç seçenek vardır. Eğer dağıtılır ölçekler ve sunucuların queing açık kaynak mesajının kullanır şey gerekiyorsa İkinci seçenek http://code.google.com/p/django-queue-service/

: http: // stackoverflow kereviz neye ihtiyacınız

http://ask.github.com/celery/introduction.html http://github.com/ask/celery/tree

+0

Evet, sonuçlar istek başına tamamen farklı. –

+0

Demiurge, bu durumda bu görüşün ne sıklıkta talep edileceğine bakmanız gerekiyor. Bir sürü olacaksa, bir kuyruk çözümü öneririm. Bu şekilde görünüm istenebilir, kullanıcının tamamlamak için beklemesi gerekmeden kuyruğa eklenebilir. – ismail

İlgili konular