Shan
Shan

Reputation: 1138

Asynchronous requests in AppEngine

I'm building an app that essentially does the following:

The problem here is that the task is expected to take quite long. I was thus hoping to make the request asynchronous. Does appengine allow this ?

If not, what are my options ? I was looking at the documentation for task queues. While it satisfies part of what I'm trying to do, I'm not very clear on how the queue notifies the client when the task is complete, so that the redirect can be initiated.

Also, what if the results of the task have to be returned to the calling client itself ? Is that possible ?

Upvotes: 1

Views: 1327

Answers (1)

Dan Cornilescu
Dan Cornilescu

Reputation: 39824

You can't (shouldn't really) wait for completion, GAE is not designed for that. Just launch the task, get a task ID (unique, persisted it in the app) and send the ID back to the client in the response to the launch request.

The client can check, either by polling (at a reasonable rate) or simply on-demand, that status page (you can use the ID to find the right task). You can even add a progress/ETA info on that page, down the road if you so desire.

After the task completes the next status check request from the client can be redirected to the results page as you mentioned.

This Q&A might help as well, it's a very similar scenario, only using the deferred library: How do I return data from a deferred task in Google App Engine

Update:

The Task Queues are preferable to the deferred library, the deferred functionality is available using the optional countdown or eta arguments to taskqueue.add():

  • countdown -- Time in seconds into the future that this task should run or be leased. Defaults to zero. Do not specify this argument if you specified an eta.

  • eta -- A datetime.datetime that specifies the absolute earliest time at which the task should run. You cannot specify this argument if the countdown argument is specified. This argument can be time zone-aware or time zone-naive, or set to a time in the past. If the argument is set to None, the default value is now. For pull tasks, no worker can lease the task before the time indicated by the eta argument.

Upvotes: 3

Related Questions