Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: user3354327Ответов: 3

У меня есть проблема с 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"

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

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

pythondjangomultithreadingresponsehttpresponse

Ответы

Ответ 1 · рейтинг 1 · Tim

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

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

Ответ 2 · рейтинг 1 · loki

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

Ответ 3 · рейтинг 1 · Peter Bob Ukonu

Это очень просто, инкапсулируйте #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()

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы