在Django中,Celery是否需要异步文件写入功能?

时间:2017-12-07 23:50:15

标签: python django multithreading csv asynchronous

我打算在我的Django应用程序中添加一些功能,当调用某些视图时,它会将一行数据写入csv文件:

    session_dict = collectUserDataFromRequest(request) #....collect parameters from  request

     if os.path.isfile(filename):

        with open(filename, 'a') as csv_file:
            a = csv.DictWriter(csv_file,session_dict.keys())
            a.writerow(session_dict)
            csv_file.close()

    else:

        with open(filename, 'w') as csv_file:
            w = csv.DictWriter(csv_file,session_dict.keys())
            w.writeheader()
            w.writerow(session_dict)
            csv_file.close() 

     # then proceed to render the html

我遇到的一个问题是,当多个用户同时访问我的应用时,会遇到潜在的竞争条件。虽然可以按任何顺序将数据添加到csv文件中,但我不希望某些用户等待更长时间等待在csv文件上释放锁定时加载视图。因此,我认为要写入可在后台运行的文件的字符串数据的异步队列听起来像是一个很好的解决方法。

我被告知Celery是一个很好的框架,用于向我的Django应用程序添加异步进程。但通过几个教程,我发现通常需要额外的框架,如Redis。我担心这对我的目标可能有点过分。我是否会使用标准的多处理方法,例如解释here,或者在Django生产环境中使用多线程还有其他缺点。

1 个答案:

答案 0 :(得分:1)

第一点:您不应该尝试写入同一文件的并发请求。根据您的使用情况,您应该将数据存储在适当的关系数据库中,该数据库知道如何处理并发访问或拥有每个用户文件。

第二点:不,你不一定需要芹菜用于异步操作,有quite a few other solutions