从芹菜延迟回拨

从芹菜延迟回拨

问题描述:

我正在使用django芹菜。我需要下载一个大的视频文件。当文件完成下载时,我想更新我的数据库。有没有一种方法可以添加一个回调,当任务完成时,将调用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) 

如果有另一种方式来更新对象的芹菜任务完成后,我会很感兴趣的是也。

PS:我试着通过v = Video.objects.latest()而不是v = Video.objects.latest().id,所以我可以沿途更新实例,但是芹菜不喜欢它,因为它是一个对象而不是字符串。虽然它没有抛出任何错误,但我每次调用a.ready时都返回False。

+1

为什么不传递对象ID并在任务结束时执行数据库获取和更新? – balsagoth 2012-05-02 20:45:32

你可以从任务中调用你的Django代码。例如:

def video_download(v): 
    from video.models import Video 
    v = Video.objects.get(pk=v) 
    do_download(v) 
    v.status = "downloaded" 
    v.save() 
+0

嗨,你能告诉我,这是否意味着,在引擎盖下,芹菜只是让django进程的分叉执行回调? (有助于了解相关的非芹菜情况)。 – 2015-11-27 01:14:49

+0

不,没有分叉本身,你启动一个单独的Celery工作进程,它监听新的任务,当它得到一个时,执行它(例如回调) – 2015-11-27 06:47:19