1

在我的 django 应用程序上,我有一个可能需要一些时间才能运行的报告(一个 csv 下载)。当用户运行报告时,他们将被重定向到“处理”页面,其中 javascript 函数每秒检查服务器以查看 csv 是否已创建(文件名包含在 HttpResponse 对象中)。

我正在寻找的是一种识别创建 csv 的线程的方法。这样我就可以estimated_time_to_completion向线程添加一个属性,并将此信息包含在保留页面中。事实上,我可以停止检查(解锁的)csv 是否存在——我可以询问线程是否完成。

我的 csv 构建线程看起来像 -

class CsvBuilder(threading.Thread):

    def __init__(self, file_name, parameters)
        self.file_name = file_name
        self.parameters = parameters
        threading.Thread.__init__(self)

    def run():
        # ...
        file = open(self.file_name, 'wb')
        writer = csv.writer(file)
        for patient in patients:
            writer.writerow('some data')
            self.time_remaining = # a timedelta object
        file.close()

然后我的 django 请求看起来像 -

def create_csv(request):
    '''
    Standard django view to create a csv
    '''
    # get filename and parameters from request
    thread = CsvBuilder (file_name, parameters)
    return render_to_response('processing.html', {"thread_id": thread.thread_id})

def check_progress(request):
    '''
    An ajax call to check the progress on a report
    '''
    thread_id = requst.GET['thread_id']
    # find the thread 
    return HttpResponse(thread.time_remaining)

这可能吗?还是我应该以不同的方式解决这个问题?

4

2 回答 2

4

使用专用的后台任务库可能是最简单和最安全的,它们是为这样的用例而设计的。python 最常见的是Celery。它具有良好的 Django 支持,并且非常易于使用。

于 2012-07-11T10:56:05.523 回答
1

我建议您让您的 writer 函数更新用于 time_remaining 计算的 memcached 键/值。

如果是我,我可能会在长期运行的工作中使用Celery,从 django 启动一个线程似乎可能有陷阱,但没有什么特别的想法浮现在脑海中。

于 2012-07-11T10:57:16.113 回答