我想收集一些需要一些时间来处理的统计数据,但这不会影响正在返回的用户内容。我目前正在通过第一次缓存,然后使用cron作业处理它。
返回用户内容后,有没有办法立即完成这项工作?
应该是这样的:
def post(self):
self.response.out.write("some output")
# here user should not wait any more output
# loading should be end in user browser.
collectSomeStatistics(self)
(我正在使用Python 2.7)
答案 0 :(得分:2)
您可以使用deferred library
from google.appengine.ext import deferred
def do_something_expensive(a, b, c=None):
logging.info("Doing something expensive!")
# Do your work here
# Somewhere else
deferred.defer(do_something_expensive, "Hello, world!", 42, c=True)
所以你的代码变成了:
def post(self):
deferred.defer(collectSomeStatistics,args)
self.response.out.write("some output")
然后执行您的函数作为单独的任务,并且对deferred的调用立即返回。当然,您将无法在返回给用户的内容中包含该延迟函数的任何结果。
答案 1 :(得分:1)
Google App Engine的API提供taskqueue来处理此类情况。
from google.appengine.api import taskqueue
def post(self):
taskqueue.add(queue_name='expensive_query', url="/path/to/_an_internal_method/")
self.response.out.write("some output")