Как django работает с многопоточностью в view.py?

У меня есть проблема с django, это было похоже на то, что когда пользователи отправляют некоторые данные, они переходят в view.py для обработки и в конечном итоге переходят на страницу успеха.

Но процесс слишком долгий. Я не хочу, чтобы пользователи ждали так долго. Я хочу сразу же перейти на страницу успеха после того, как пользователи отправят данные. И сервер обработает данные после возврата успеха страница.

Подскажите, пожалуйста, как с этим бороться? это был мой код, но я не знаю, почему он не работал.

url.py

from django.conf.urls import patterns, url
from hebeu.views import handleRequest

urlpatterns = patterns('',
    url(r'^$', handleRequest),
)

view.py

def handleRequest(request):
    if request.method == 'POST':
        response = HttpResponse(parserMsg(request))
        return response
    else:
        return None

def parserMsg(request):
    rawStr = smart_str(request.body)
    msg = paraseMsgXml(ET.fromstring(rawStr))
    queryStr = msg.get('Content')
    openID = msg.get('FromUserName')
    arr = smart_unicode(queryStr).split(' ')
    #start a new thread
    cache_classroom(openID,arr[1],arr[2],arr[3],arr[4]).start()

    return "success"

Мой английский не очень хорош, я надеюсь, вы понимаете.


person user3354327    schedule 26.02.2014    source источник
comment
Раньше я встречал такое же условие, просто используйте ajax! см. здесь нет представления refreshdjango без перенаправления или обновления страницы"> stackoverflow.com/questions/18426456/   -  person WeizhongTu    schedule 26.02.2014


Ответы (3)


Взгляните на Celery, это распределенная очередь задач, которая отлично справится с вашей ситуацией. Есть небольшая настройка, чтобы все заработало, но как только это не так, с Celery действительно легко работать.

Для интеграции с Django начните здесь: http://docs.celeryproject.org/en/latest/django/index.html

person Tim    schedule 26.02.2014

Напишите команду управления для parseMsg и запустите ее, используя subprocess.popen, и верните успех пользователю, а процесс parseMsg будет работать в фоновом режиме. если такого рода операций больше в приложении, вам следует использовать сельдерей.

person loki    schedule 26.02.2014
comment
могу ли я использовать сельдерей без rabbitmq? я не знаю, что делать - person user3354327; 27.02.2014

Это очень просто, инкапсулируйте #start новый поток с кодом ниже

from threading import Thread
from datetime import datetime

class ProcessThread(Thread):
    def __init__(self, name):
        Thread.__init__(self)
        self.name = name
        self.started = datetime.now()

    def run(self):
        cache_classroom(openID,arr[1],arr[2],arr[3],arr[4]).start()
        # I added this so you might know how long the process lasted
        # just incase any optimization of your code is needed
        finished = datetime.now()
        duration = (self.start - finished).seconds
        print "%s thread started at %s and finished at %s in "\
              "%s seconds" % (self.name, self.started, finished, duration)

# let us now run start the thread
my_thread = ProcessThread("CacheClassroom")
my_thread.start()
person Peter Bob Ukonu    schedule 09.07.2015
comment
как вы обеспечите правильное завершение потока при закрытии приложения? Все ресурсы, захваченные разветвленным потоком, должны быть изящно освобождены. Одним из решений проблемы является использование перехватчиков выключения с использованием сигналов, но у него есть собственный набор проблем (одна из них заключается в том, что вы не можете установить обработчик сигнала из неосновного потока). - person Shailesh Pratapwar; 06.01.2018