从芹菜延迟回拨
我正在使用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。
你可以从任务中调用你的Django代码。例如:
def video_download(v):
from video.models import Video
v = Video.objects.get(pk=v)
do_download(v)
v.status = "downloaded"
v.save()
嗨,你能告诉我,这是否意味着,在引擎盖下,芹菜只是让django进程的分叉执行回调? (有助于了解相关的非芹菜情况)。 – 2015-11-27 01:14:49
不,没有分叉本身,你启动一个单独的Celery工作进程,它监听新的任务,当它得到一个时,执行它(例如回调) – 2015-11-27 06:47:19
为什么不传递对象ID并在任务结束时执行数据库获取和更新? – balsagoth 2012-05-02 20:45:32