2012-04-24 10 views
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) 

を見てしまいます。

PS:v = Video.objects.latest().idの代わりにv = Video.objects.latest()を渡してみましたので、途中でインスタンスを更新するだけでしたが、セロリはオブジェクトであって文字列ではないため、好きではありませんでした。私はa.readyと呼ぶたびにエラーを投げなかったが、Falseを返した。

+1

なぜオブジェクトidを渡さずにタスクの最後にデータベースの取得と更新を実行するのですか? – balsagoth

答えて

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() 
+0

こんにちは、これは、ボンネットの下で、セロリがコールバックのためのジャンゴプロセスのフォークを実行することを意味する場合は、私に教えていただけますか? (関連した非セロリの状況についてこれを知るのに役立つだろう)。 –

+0

いいえ、それ自体フォークはありません。新しいタスクをリッスンする別個のCeleryワーカープロセスを開始し、新しいタスクを取得すると、コールバックなどのプロセスが実行されます。 –

関連する問題