django如何在view.py中使用多线程?

时间:2014-02-26 05:45:40

标签: python django multithreading response httpresponse

我有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"

我的英语不好,我希望你能理解。

3 个答案:

答案 0 :(得分:1)

看看Celery,它是一个分布式任务队列,可以完美地处理您的情况。有一些设置可以让一切正常工作,但是一旦Celery真的很容易使用。

与Django集成从这里开始:http://docs.celeryproject.org/en/latest/django/index.html

答案 1 :(得分:1)

为parseMsg编写一个管理命令,并使用subprocess.popen触发该命令,并将成功返回给用户,parseMsg进程将在后台运行。如果这种操作在应用程序中更多,那么你应该使用芹菜。

答案 2 :(得分:1)

这很安静,使用下面的代码将#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()