【问题标题】:Callback from delay in Celery芹菜延迟回调
【发布时间】:2012-04-24 17:32:11
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 为什么在任务结束时不传递对象 id 并执行数据库获取和更新?

标签: django celery django-celery


【解决方案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 工作进程,它监听新任务并在收到新任务时执行它(例如回调)
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 2018-08-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多