【问题标题】:How django work with multi-thread in view.py?django 如何在 view.py 中使用多线程?
【发布时间】:2014-02-26 05:45:40
【问题描述】:

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

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

【问题讨论】:

标签: python django multithreading response httpresponse


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 没有rabbitmq可以用celery吗?不知道怎么办
    【解决方案3】:

    这很简单,用下面的代码封装#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()
    

    【讨论】:

    • 应用关闭时如何确保线程正确终止?分叉线程获取的所有资源都必须以优雅的方式释放。该问题的一种解决方案是通过使用信号来使用关闭挂钩,但它有自己的一组问题(一个是,您不能从非主线程设置信号处理程序)
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2013-05-25
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多