我正在开发一个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)
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部分。
这样做的好处是,您可以获得每次上传的记录,您可以使用轮询请求显示状态,并且您可以根据需要在任何服务器上执行处理。