根据请求,django中有没有办法首先返回响应,然后继续做一些更新数据库的工作?
这是出于性能原因。我希望用户能够非常快速地收到他们的响应,但是DB更新需要一些时间。
感谢。
答案 0 :(得分:1)
我正在调查的事情:django channels 您可以对消息进行排队以更新数据库并同时发送响应。然后另一个工人将获得该消息并完成工作。 但是,django-channels不能确保您的消息不会丢失(确保它最多只能到达一次)...因此,如果数据库更新非常重要,您可能希望寻找更可靠的信息。
从未测试过这个...只是一个想法
答案 1 :(得分:1)
没有。常规Django遵循请求 - 响应路径,因此使用纯Django解决方案,它无法返回响应然后更新数据库。
根据您的要求,您可能希望查看消息代理系统,例如Django频道或Django-celery。
答案 2 :(得分:1)
如果您使用带有enable-threads = true
的uwsgi,那么一个简单的解决方案就是:
import threading
def myview(request):
obj = MyObj()
threading.Thread(target=save_to_db, args=(obj,)).start()
return ...
def save_to_db(obj):
obj.save()
这对于偶尔的后台任务来说已经足够了,如果你想以这种方式处理每个用户请求,那么某种消息队列将是一个更具可扩展性的解决方案。
答案 3 :(得分:0)
您可以对其进行多线程处理,以便一个线程返回响应,第二个线程执行该任务。另一种方法是将其传递给消息服务(沿着celery + redis / rabbitmq的行)并让它处理任务。