2011-07-20 31 views
0

我正在使用用户点击的django项目提交一组需要在后端处理的图像。即使在主线程使用Django终止之后运行线程

图片已经上传到服务器上,但一旦用户点击提交,处理请求需要大量时间,大约15秒钟,直到显示“谢谢您使用我们的消息”。

我想要做的是将流程中耗时的部分放入不同的线程,并立即显示感谢信息。我的代码如下所示:

def processJob(request): 
    ... 
    threading.Thread(target=processInBackground, args=(username, jobID)).start() 
context = {} 
context.update(csrf(request)) 
return render_to_response('checkout.html', context) 

def processInBackground(username, jobID): 
... 
    (processing the rest of the job) 

但是,一旦我运行它:它会创建一个新的线程,但它会终止主线程终止的秒数。有什么办法可以在后端处理这些东西,而用户马上得到感谢信息?

+0

“进程耗时的部分进入不同的线程”。总是错误的做法。你不想要一个线程。你想要一个过程。 –

+0

不,在单独的Django中没有办法做到这一点。您可以使用[芹菜](http://celeryproject.org/)[附加信息的博客文章](http://www.turnkeylinux.org/blog/django-celery-rabbitmq) –

回答

0
PROCESSORS = [] # empty list of background processors 

继承Trheading.thread

class ImgProcessor(threading.Thread): 
    def __init__(self, img, username, jobID): 
     self.img = img 
     self.username = username 
     self.jobID = jobID 
     threading.Thread.__init__(self) 
     self.start() 
     self.readyflag = False 

    def run(self): 
     ... process the image ... 
     self.readyflag = True 

然后,发送请求时:

def processJob(request): 
    PROCESSORS.append(ImgProcessor(img, username, jobID)) 
    .... remove all objects in PROCESSORS that have readyflag == True 
0

这不一定是你要找的东西,但我的摄影师网站我们使用Javascript(使用PLUpload)异步上传照片,这允许我们一次回调多个照片上传状态。上传完成后,文件将保存到具有唯一名称的文件夹中,并保存到数据库队列中,然后由cron作业拾取该文件,该作业通过队列运行以处理尚未完成的任何内容,然后对其进行处理。我使用的是Django的自定义管理命令,因此我得到了Django框架的所有优点,减去了Web部分。

这样做的好处是您可以获得每次上传的记录,您可以使用轮询请求显示状态,并且您可以根据需要在任何希望的服务器上执行处理。