创建一个 celery 任务来执行您需要对对象执行的任何操作:
任务.py
from celery.decorators import task
@task()
def foo(object):
object.do_some_calculation()
Run Code Online (Sandbox Code Playgroud)
然后创建一个django 信号,每次保存模型实例时都会触发该信号,在 Celery 中对任务进行排队:
模型.py
class MyModel(models.Model):
...
from django.db.models.signals import post_save
from django.dispatch import receiver
from mymodel import tasks
@receiver(post_save, sender=MyModel)
def queue_task(sender, instance, created, **kwargs):
tasks.foo.delay(object=instance)
Run Code Online (Sandbox Code Playgroud)
需要注意的是,django 的信号是同步的,换句话说,该queue_task函数在请求周期内运行,但该函数所做的只是告诉 Celery在后台queue_task处理工作的实际内容 ( )do_some_calculation