我只有在django请求完成时才需要运行celery任务。 有可能吗?
答案 0 :(得分:0)
尝试这样的事情:
Django在每个请求结束时发送request_finished 您可以通过sender参数
访问请求对象from django.dispatch import receiver
from django.core.signals import request_finished
from app.tasks import my_task
@receiver(request_finished)
def add_celery_task(sender):
if sender.__name__ != 'StaticFilesHandler':
my_task.delay()
如果您在开发环境中运行服务器,最好检查发件人的名称,以避免为您所服务的每个静态文件添加太多芹菜任务。
答案 1 :(得分:0)
我发现在请求完成后确保您的任务发生的最佳方法是编写自定义中间件。在process_response
方法中,您可以处理不会对页面加载时间或性能造成太大影响的任何快速操作。还有别的,你可以交给芹菜。任何保存或数据库事务都在process_response
被调用(AFAICT)时完成。
答案 2 :(得分:-2)
您可以使用芹菜的延迟方法在后台运行任务。我的意思是在返回响应之前,您可以调用延迟方法将任务放在后台。
有些事情是这样的:
task_name.delay(arg1, arg2, ...)
通过执行此操作,您的任务将被置于后台并异步运行,这不会阻止请求响应周期。