只有当django请求完成时,我才需要运行芹菜任务。有可能吗?
我发现,确保任务在请求完成后完成的最佳方法是编写自定义中间件。在process_response
方法中,您可以处理任何不会对页面加载时间或性能产生太大影响的快速操作。其他任何东西,你都可以交给赛莱里。任何保存或数据库事务都在调用process_response
(AFAICT)时完成。
试试这样的东西:
Django在每个请求的末尾发送request_finished
您可以通过发送方参数访问请求对象
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()
若您在开发环境中运行服务器,最好检查发件人的名称,以避免为您提供的每个静态文件添加太多的芹菜任务。
您可以在后台运行任务,使用芹菜的延迟方法。我的意思是,在返回响应之前,您可以调用延迟方法将任务放在后台。
类似这样的东西:
task_name.delay(arg1, arg2, ...)
通过这样做,您的任务将被置于后台并异步运行,这不会阻止请求-响应周期。