Created
March 2, 2013 13:54
-
-
Save sehmaschine/5071098 to your computer and use it in GitHub Desktop.
celery update_state issue
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from tasks import full_export_task | |
def export_year_zip(user): | |
full_export_task.update_state(state="PROGRESS", meta={}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
task() | |
def full_export_task(user, task_id=None): | |
from export.views.user_full_export import export_year_zip | |
result = export_year_zip(user) | |
return result |
The above code is just an example. export_year_zip is actually much longer and does exactly what you've described: telling the user how much of the export has already been processed with a long–running task.
The problem I'm having is this: You say that it refers to the "current task". But how does celery know what the "current task" is when I'm having 4 tasks running synchronously? I just want to prevent that all 4 tasks suddenly have the same state. And before I push this to the live instance I wanted to make sure that this code is supposed to work (although the tests are running fine).
I think the problem is that you're calling update_state
from outside the @task
-decorated function. Not really sure, sorry.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I think the idea of the custom task state is to notify any applications that are aware of this running of the changing state. For example, suppose you have a video transcoding job that you run in a task. This is done in chunks because the video is very large. Before you start processing the video, you know you have 100 chunks to process. The
update_state
method will allow you to update the task's state (i.e. progress in the video example) as the task is running. This means that you can say, "If anyone cares, I have just finished the first chunk of 100. I'll let you know when I'm done with the next one."The reason why there is no reference to
task_id
is because it refers to the current task.Does that make sense?