Celery中的延迟回调函数

3

我正在使用django-celery。我需要下载一个大视频文件,希望在文件下载完成后更新我的数据库。是否有一种方法可以添加回调函数来调用django代码,而不是另一个任务,在任务完成时执行?我的理想代码应该像这样...

from video.tasks import video_download
from video.models import Video

def my_callback(v):    
    v.status = "downloaded"
    v.save()

def download_http(request):
   v = Video.objects.latest().id #this is a string
   a = video_download.delay(v, my_callback)

如果有其他方法可以在celery任务完成后更新对象,我也会感兴趣。
PS:我尝试传入v = Video.objects.latest()而不是v = Video.objects.latest().id,这样我就可以在途中更新实例,但是celery不喜欢它,因为它是一个对象而不是一个字符串。虽然它没有抛出任何错误,但每次调用a.ready时它都返回False。

1
为什么您不传递对象 ID 并在任务结束时执行数据库的获取和更新操作? - Ivan Pereira
1个回答

1
您可以从任务中直接调用Django代码。例如:
def video_download(v):
     from video.models import Video
     v = Video.objects.get(pk=v)
     do_download(v)
     v.status = "downloaded"
     v.save()

你好,能否告诉我这是否意味着,在底层,Celery只是为回调执行创建了一个Django进程的分支?(对于一个相关的非Celery情况会有所帮助) - Iain Duncan
不,没有分叉本身,你需要启动一个单独的Celery工作进程,它会监听新任务,当它接收到一个任务时,执行它(例如回调函数)。 - Spc_555

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接