Python 在django中运行长进程,无需芹菜和多进程

Python 在django中运行长进程,无需芹菜和多进程,python,django,multithreading,asynchronous,Python,Django,Multithreading,Asynchronous,我有一个项目,它从用户那里获取大型CSV文件,并在Django视图中使用多线程处理它 我无法使用多进程,因为该进程包含无法pickle的外部对象 芹菜在腌制数据方面也有类似的问题 我想使用view,它可以在外部处理这个大型CSV进程,而不必等待进程完成 如果有人刷新页面,相同的视图调用会创建另外两个线程,我想阻止创建新线程 我有这样的代码: q = Queue() def view(request): t1 = Thread(target = threadfunction, args=(

我有一个项目,它从用户那里获取大型CSV文件,并在Django视图中使用多线程处理它

我无法使用
多进程
,因为该进程包含无法pickle的外部对象

芹菜在腌制数据方面也有类似的问题

我想使用view,它可以在外部处理这个大型CSV进程,而不必等待进程完成

如果有人刷新页面,相同的视图调用会创建另外两个线程,我想阻止创建新线程

我有这样的代码:

q = Queue()
def view(request):
    t1 = Thread(target = threadfunction, args=(request,csvdata))
    t2 = Thread(target = threadfunction, args=(request,csvdata))
    q.put(t1)
    1.put(t2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    data = []
    while not q.empty():
        data.extend(q.get())
    return HttpResponse(str(data))

def threadfunction(receiverequest,csvdata):
    # reading csv and doing some process takes 100secs 
    returns #somelistdata

将csvdata存储在磁盘上的某个位置,使用芹菜、RQ或带有管理命令的简单cron作业,其中文件路径将作为参数传递(而不是csvdata)。在视图中,计划芹菜/rq作业,或使用计划的cron作业向表中添加条目。最后,您的视图应该重定向到一种定期刷新或通过“ajax”调用刷新的“状态页”。后台作业应生成一个结果文件。完成作业后,状态页面应显示指向生成文件的链接。