2013-07-11 27 views
14

Django çok iş parçacığı yapabilir mi?Django çok iş parçacığı yapabilir mi?

Yapmak istediğim şey şudur: web sayfasındaki bir düğmeyi tıklatın, sonra model.py'deki bazı işlevler çalışmaya başlar, örneğin, İnternet'ten bazı verileri tarar, bittiğinde, kullanıcıya geri döner Sonuçlar.

Model.py'deki işlevleri yürütmek için yeni bir iş parçacığı açmak zorunda olduğumu merak ediyorum, kimse bana nasıl yapılacağını söyleyebilir mi? Çok teşekkür ederim.

+0

tamamlamaya çalıştığınız Ne ? belki bunu AJAx, WebSocket, sihirli midilli gibi öncü teknolojilerle yapabilirsiniz ... – gipi

+0

Sihirli midilli nedir? Google üzerinde bulamıyor ... –

cevap

9
  1. Evet, çok iş parçacığı yapabilir, ancak genellikle eşdeğerini yapmak için Kereviz kullanır. You can read about how in the celery-django tutorial.
  2. aslında kullanıcının web sitesini beklemesini istemesi nadirdir. Riskler zaman aşımından daha iyidir.

İşte açıkladığınız şeyin bir örneği.

User sends request 
Django receives => spawns a thread to do something else. 
main thread finishes && other thread finishes 
... (later upon completion of both tasks) 
response is sent to user as a package. 

iyi yolu: Projeniz için bazı overkill çerçeve eklemek istemiyorsanız

User sends request 
Django receives => lets Celery know "hey! do this!" 
main thread finishes 
response is sent to user 
...(later) 
user receives balance of transaction 
+58

Kereviz birçok amaç için overkill. Lütfen istek/yanıtı engellememesi gereken her şey için sihirli mermi olarak tavsiye etmeyi bırakın. Herkes bir metin satırının nasıl saklanacağını sorduğunda RDBMS'yi önermek gibidir. –

+5

@andybak Alternatif önermek için çekinmeyin. Bana göre, bu yasal bir kullanım gibi geliyor. – cwallenpoole

+4

özelliklerine bağlıdır, ancak sadece bir iş parçacığı ve tamamlama için anket oluşturabilir, görevleri kontrol eden basit bir cron işi kullanabilir veya daha fazla özelliğe gereksinim duyarsanız, birkaç tane 'kereviz kadar karmaşık değil' kullanabilirsiniz. huey veya django-background-tasks gibi projeler. –

0

, sadece kullanabilirsiniz subprocess.Popen:

def my_command(request): 
    command = '/my/command/to/run' # Can even be 'python manage.py somecommand' 
    subprocess.Popen(command, shell=True) 
    return HttpResponse(status=204) 
İlgili konular