即使在主线程使用Django终止后运行线程

时间:2011-07-20 00:03:55

标签: python django multithreading

我正在开发一个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)

然而,一旦我运行它:它创建一个新线程,但它终止主线程终止的秒数。有什么方法可以处理后端中的内容,而用户会立即收到感谢信息吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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